Как передать csrf_token в post params editurl jqgrid?

Я использую JqGrid с картой Django. Это JS:

jQuery("#list").jqGrid({ url:'{% url views.manage.devicesajax %}', datatype: 'json', mtype: 'GET', colNames:['DID', 'UDID', 'Owner', 'Name', 'First seen', 'Last seen'], colModel :[ {name:'did', index:'did', width: 30, searchoptions:{sopt:['eq','ne','bw','cn']}}, {name:'udid', index:'udid', width: 120, editable: true, searchoptions:{sopt:['eq','ne','bw','cn']}}, {name:'d_owner', index:'d_owner', width: 70, editable: true, searchoptions:{sopt:['eq','ne','bw','cn']}}, {name:'d_name', index:'d_name', editable: true, searchoptions:{sopt:['eq','ne','bw','cn']}}, {name:'d_firstseen', index:'d_firstseen', width: 80}, {name:'d_lastseen', index:'d_lastseen', width: 80}], pager: jQuery('#pager'), rowNum:20, rowList:[20,50,100], sortname: 'did', sortorder: "desc", multiselect: true, viewrecords: true, imgpath: 'themes/basic/images', caption: 'Devices list', height: 330, width: 1000, onSelectRow: function(id) { var id = $("#list").getRowData(id).message_id; message_id = id; }, editurl: "{% url views.manage.deviceseditajax %}" }); 

Когда я редактирую строку в JqGrid, я получаю ошибку от editurl:

  • как получить электронную почту пользователя с помощью python social auth с помощью facebook и сохранить его
  • Сериализовать методы @property в классе Python
  • Django + apache & mod_wsgi: необходимо перезапустить apache после изменений
  • Обслуживание больших файлов (с большими нагрузками) в Django
  • Как получить python-dev для окон?
  • Django: несколько шаблонов url, начиная с корневого распространения через файлы
  • Запрещено (403) Проверка CSRF не удалась. Запрос прерван.

    Это потому, что csrf_token не переходит к editurl с другими данными. Как добавить csrf_token в запрос POST для редактирования?

    Этот код отлично работает (полный фрагмент jqgrid init):

      jQuery("#list").jqGrid({ url:'{% url views.manage.devicesajax %}', datatype: 'json', mtype: 'GET', colNames:['DID', 'UDID', 'Owner', 'Name', 'First seen', 'Last seen'], colModel :[ {name:'did', index:'did', width: 30, searchoptions:{sopt:['eq','ne','bw','cn']}}, {name:'udid', index:'udid', width: 120, editable: true, searchoptions:{sopt:['eq','ne','bw','cn']}}, {name:'d_owner', index:'d_owner', width: 70, editable: true, searchoptions:{sopt:['eq','ne','bw','cn']}}, {name:'d_name', index:'d_name', editable: true, searchoptions:{sopt:['eq','ne','bw','cn']}}, {name:'d_firstseen', index:'d_firstseen', width: 80}, {name:'d_lastseen', index:'d_lastseen', width: 80}], pager: jQuery('#pager'), rowNum:20, rowList:[20,50,100], sortname: 'did', sortorder: "desc", multiselect: true, viewrecords: true, imgpath: 'themes/basic/images', caption: 'Devices list', height: 330, width: 1000, editurl: "{% url views.manage.deviceseditajax %}", }); jQuery("#list").navGrid('#pager',{edit:true,add:true,del:true,search:true}, { closeAfterEdit:true, reloadAfterSubmit:true, closeOnEscape:true, editData: {csrfmiddlewaretoken: '{{ csrf_token }}'} }, { closeAfterAdd:true, reloadAfterSubmit:true, closeOnEscape:true, editData: {csrfmiddlewaretoken: '{{ csrf_token }}'} }, { closeOnEscape:true, delData: {csrfmiddlewaretoken: '{{ csrf_token }}'} }, { caption: "Search", Find: "Find", Reset: "Reset", sopt : ['eq', 'cn'], matchText: " match", rulesText: " rules", closeAfterSearch: true, afterShowSearch: function () { $('#reset_filter1_block').show(); } } ); 

  • Автономный скрипт Django
  • django - getlist ()
  • Javascript эквивалент locals Python ()?
  • Проверка JQuery - проверка доступности электронной почты и имени пользователя с сервера Django
  • как правильно передать json-объект на сервер флеши, используя jquery ajax
  • Установка PIL с пипсом
  • 4 Solutions collect form web for “Как передать csrf_token в post params editurl jqgrid?”

    Я не использую структуру Django и не знаком с csrf_token , но после поиска в Google кажется, что вам нужно установить его в HTTP-заголовке запроса: xhr.setRequestHeader('X-CSRF-Token', csrf_token); , Для этого в случае jqGrid вы можете использовать обработчик события loadBeforeSend :

     loadBeforeSend: function(jqXHR) { // you should modify the next line to get the CSRF tocken // in any way (for example $('meta[name=csrf]').attr('content') // if you have <meta name="csrf" content="abcdefjklmnopqrstuvwxyz="/>) var csrf_token = '<%= token_value %>'; // any way to get jqXHR.setRequestHeader('X-CSRF-Token', csrf_token); } 

    См. Здесь очень близкую проблему.

    ОБНОВЛЕНО : для публикации дополнительных данных в случае использования редактирования формы вы можете использовать editData : editData: {csrfmiddlewaretoken: '<% = token_value%>'}. Например:

     jQuery("#list").jqGrid('navGrid','#pager',{}, { // Edit option (parameters of editGridRow method) recreateForm:true, reloadAfterSubmit:false, closeOnEscape:true, savekey: [true,13], closeAfterEdit:true, ajaxEditOptions: { beforeSend: function(jqXHR) { // you should modify the next line to get the CSRF tocken // in any way (for example $('meta[name=csrf]').attr('content') // if you have <meta name="csrf" content="abcdefjklmnopqrstuvwxyz="/>) var csrf_token = '<%= token_value %>'; // any way to get jqXHR.setRequestHeader('X-CSRF-Token', csrf_token); } }, editData: { csrfmiddlewaretoken: '<%= token_value %>' } }, { // Add options (parameters of editGridRow method) recreateForm:true, reloadAfterSubmit:false, closeOnEscape:true, savekey: [true,13], closeAfterAdd:true, ajaxEditOptions: { beforeSend: function(jqXHR) { // you should modify the next line to get the CSRF tocken // in any way (for example $('meta[name=csrf]').attr('content') // if you have <meta name="csrf" content="abcdefjklmnopqrstuvwxyz="/>) var csrf_token = '<%= token_value %>'; // any way to get jqXHR.setRequestHeader('X-CSRF-Token', csrf_token); } }, editData: { csrfmiddlewaretoken: '<%= token_value %>' } } ); 

    Я разместил здесь оба пути: настройка HTTP-заголовка «X-CSRF-токена» и публикация параметра csrfmiddlewaretoken . Вы можете удалить один из вариантов после соответствующих экспериментов.

    Если вы используете некоторые параметры для всех сеток на странице, вы можете лучше изменить значения по умолчанию (подробнее см. Здесь )

     jQuery.extend(jQuery.jgrid.edit, { recreateForm:true, reloadAfterSubmit:false, closeOnEscape:true, savekey: [true,13], closeAfterAdd:true, closeAfterEdit:true, ajaxEditOptions: { beforeSend: function(jqXHR) { // you should modify the next line to get the CSRF tocken // in any way (for example $('meta[name=csrf]').attr('content') // if you have <meta name="csrf" content="abcdefjklmnopqrstuvwxyz="/>) var csrf_token = '<%= token_value %>'; // any way to get jqXHR.setRequestHeader('X-CSRF-Token', csrf_token); } }, editData: { csrfmiddlewaretoken: '<%= token_value %>' } }); 

    Эта настройка является общей для форм добавления и редактирования. Таким образом, вы можете использовать navGrid в упрощенной форме.

     jQuery("#list").jqGrid('navGrid','#pager'); 

    Проверьте свои файлы cookie. Django CSRF также сохраняет cookie csrftoken который имеет то же значение, что и csrf_token, которое вы использовали бы в форме. Вы можете использовать любую библиотеку cookie Javascript для получения файла cookie и передать его в POST-запрос как csrfmiddlewaretoken .

    Согласно документации jqGrid , вы можете передать параметры postData . Если вы используете плагин jQuery Cookie , вы можете добавить что-то вроде:

     postData: { csrfmiddlewaretoken: $.cookie(CSRF_COOKIE_NAME) }, 

    к вашему списку вариантов jqGrid.

    CSRF_COOKIE_NAME устанавливается в вашем приложении django settings.py и по умолчанию является «csrftoken».

    Я нашел простое решение с использованием последних JqGrid и Inline Edit submit csrf_token для запроса POST django без @csrf_exempt

     onSelectRow: function(id){ if(id && id!==lastSel){ $(selector).restoreRow(lastSel); lastSel=id; } var editparameters = { extraparam: {csrfmiddlewaretoken: $('.token-data').data('token')}, keys: true, }; $(selector).jqGrid('editRow', id, editparameters); } 

    Например, см. На моем блоге: http://yodi.polatic.me/jqgrid-inline-editing-integration-with-django-send-csrf-token/

    Python - лучший язык программирования в мире.