¿Cómo pasar csrf_token a los parámetros de publicación de editurl de jqgrid?

Estoy usando JqGrid con el framework Django. Eso es 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 %}" }); 

Cuando edito la fila en JqGrid me sale un error de editurl:

Prohibida la verificación de CSRF (403). Solicitud abortada.

Es porque csrf_token no pasa a editurl con los otros datos. ¿Cómo agregar csrf_token a la solicitud POST a editurl?

Este código funciona perfectamente (pieza completa de 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(); } } ); 

Related of "¿Cómo pasar csrf_token a los parámetros de publicación de editurl de jqgrid?"

No utilizo el framework Django y no estoy familiarizado con el csrf_token , pero después de buscar en Google parece que debe configurarlo en el encabezado HTTP de la solicitud: xhr.setRequestHeader('X-CSRF-Token', csrf_token); . Para hacer esto en caso de jqGrid puede usar el controlador de eventos 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 ) var csrf_token = '<%= token_value %>'; // any way to get jqXHR.setRequestHeader('X-CSRF-Token', csrf_token); } 

Vea aquí para un problema muy cercano.

ACTUALIZADO : para publicar datos adicionales en el caso de uso de edición de formularios, puede usar editData : editData: {csrfmiddlewaretoken: ‘<% = token_value%>‘}. Por ejemplo:

 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 ) 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 ) var csrf_token = '<%= token_value %>'; // any way to get jqXHR.setRequestHeader('X-CSRF-Token', csrf_token); } }, editData: { csrfmiddlewaretoken: '<%= token_value %>' } } ); 

Coloqué aquí en ambos sentidos: configuración del encabezado HTTP ‘X-CSRF-Token’ y publicación del parámetro csrfmiddlewaretoken . Puede eliminar una forma después de los experimentos correspondientes.

Si usa algunos parámetros para todas las cuadrículas de la página, puede cambiar los valores predeterminados (consulte aquí para obtener más información)

 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 ) var csrf_token = '<%= token_value %>'; // any way to get jqXHR.setRequestHeader('X-CSRF-Token', csrf_token); } }, editData: { csrfmiddlewaretoken: '<%= token_value %>' } }); 

La configuración es común para los formularios Agregar y Editar. Así que puedes usar navGrid en la forma simplificada.

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

Revisa tus cookies. El CSRF de Django también guarda una cookie csrftoken que tiene el mismo valor que el csrf_token que usaría en un formulario. Puede usar cualquier biblioteca de cookies de Javascript para obtener la cookie y pasarla a la solicitud POST como csrfmiddlewaretoken .

De acuerdo con la documentación de jqGrid , puede pasar las opciones de postData . Si está utilizando el complemento Cookie de jQuery , puede agregar algo como:

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

a su lista de opciones para jqGrid.

El CSRF_COOKIE_NAME se establece en su configuración de django settings.py y es ‘csrftoken’ de forma predeterminada.

Encontré una solución simple utilizando la última versión de JqGrid e Inline Edit csrf_token para solicitar POST django sin @csrf_exempt

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

Por ejemplo, consulte en mi blog: http://yodi.polatic.me/jqgrid-inline-editing-integration-with-django-send-csrf-token/