He creado un elemento de formulario dinámicamente en javascript:
var selectform = document.createElement("form")
He agregado otros elementos de entrada y estos atributos para seleccionar el formulario:
submitnselection.setAttribute('type',"submit"); submitnselection.setAttribute('value',"Submit"); submitnselection.setAttribute("name","submitnpage"); selectform.setAttribute("method", "post") selectform.setAttribute = ("action", "/test") "{% csrf_token %}"; En HTML, agregar la etiqueta de plantilla {% csrf_token %} funcionaría, pero en este caso de javascript obtuve el error 403 prohibido:
Falta el token CSRF o es incorrecto.
Encontré algunas soluciones, pero nada funcionó para mí, ¿hay alguna forma de agregar {% csrf_token %} para formar solo usando Django, Javascript y Jquery simple? También tenga en cuenta que este script está dentro de html, por lo que creo que la etiqueta de plantilla {% csrf_token %} funcionará.
Esto debería funcionar:
var inputElem = document.createElement('input'); inputElem.type = 'hidden'; inputElem.name = 'csrfmiddlewaretoken'; inputElem.value = '{{ csrf_token }}'; selectform.appendChild(inputElem); Verá, csrf_token no es más que una cadena que es el value de un elemento de entrada hidden de un formulario. ¡Eso es todo!
Puede intentar agregar un campo de entrada al formulario:
// declare an input field var input = document.createElement('input'); input.type = 'hidden'; input.name = 'csrfmiddlewaretoken'; input.value = '{% csrf_token %}'; // attach field to the form selectform.appendChild(input); // submitSi entiendo todo, debe enviar un token csrf pero no tiene ninguno para enviar al servidor desde javascript.
A partir del código de una plantilla de Django es muy fácil generar un token csrf con la etiqueta habitual de Django {% csrf_token %}, pero esto se debe a que la plantilla se procesa en el servidor para crear el HTML final que se enviará al navegador. .
Cuando está en Javascript, no puede generar un token csrf, por lo que creo que la mejor solución es crear una etiqueta invisible en la plantilla, probablemente una entrada oculta.
<input id="token" type="hidden" value="{% csrf_token %}" ></input>Y cuando en jQuery obtengo el valor con $('#token').attr('value'), tengo un ejemplo con un método jQuery POST:
token = $('#token').attr('value'); $.post(url, { 'personId': personId, 'csrfmiddlewaretoken': token // This is the important thing }, function() {} );No importa cómo lo haga, debe enviar el token con el nombre 'csrfmiddlewaretoken' y el valor del token junto con la otra información que desea enviar al servidor.
Estoy editando esto con una solución JS pura si la necesita. Sólo dilo.