¿Porqué me sale error csrf verification failed? – django

Pregunta:


Esta es mi vista:

def validarcelda(request):
    error = ''
    success = False
    if request.method == 'POST':
        celda = request.POST.get('celda', None)
        if not celda:
            error = _('Ingrese numero de celda')
        elif Empaque.objects.filter(celda__exact=celda.exists()):
            error = _('La celda ya existe')
        else:
            success = True
    ajax_vars = {'success': success, 'error': error}
    return HttpResponse(json.dumps(ajax_vars),content_type='application/javascript')

Esta es mi plantilla:

<div class="modal-header">
    <button type="reset" data-dismiss="modal" class="cerrarmodal">
        <i class="fa fa-close"> </i>
    </button>
    <h4> <span><i class="fa fa-plus"></i></span>Ingresar caja</h4>
</div>
            <div class="modal-body">
                <div class="container-fluid">
                    <form class="formatolinea" name="empaque" id="empaque" action="{% url 'empaqueingreso' %}" onSubmit="return iempaque();">
                        {% csrf_token %}
                        <label>Variedad</label>
                        <select name="variedad" value="{{variedad}}">
                            <option>Seleccione la varieda</option>
                            <option>Freedom</option>
                            <option>Vendela</option>
                        </select>
                        <div class="mensaje" id="mensajev" style='display: none;'>Debe seleccionar la variedad</div>
                        <label>Grado</label>
                        <select name="grado" value='{{grado}}'>
                            <option>Seleccione el grado</option>
                            <option value="40">40</option>
                            <option value="50">50</option>
                            <option value="60">60</option>
                            <option value="70">70</option>
                        </select>
                        <div name="mensajeg" class="mensaje" id="mensajeg" style='display: none;'>Debe seleccionar el grado</div>
                        <label>Tipo de empaque</label>
                        <select name="empaque" value='{{empaque}}'>
                            <option>Seleccione el empaque</option>
                            <option>Tabaco</option>
                            <option>Full</option>
                            <option>Cuarto</option>
                            <option>Tercio</option>
                            <option>Octavos</option>
                        </select>
                        <div name="mensajee" class="mensaje" id="mensajee" style='display: none;'>Debe seleccionar el empaque</div>
                        <label>Cantidad de ramos</label>
                        <input type="number" name="ramos" value="{{ramos}}" placeholder="Digite los ramos">
                        <div name="mensajer" class="mensaje" id="mensajer" style='display: none;'>Debe digitar el numero de ramos</div>
                        <label>Unidades por ramo</label>
                         <select name="unidades" onChange="otro(this.value);">
                            <option>Unidades por ramo</option>
                            <option>20</option>
                            <option>25</option>
                            <option value="Otro" id="otro">Otro</option>
                        </select>
                        <div name="mensajeu" class="mensaje" id="mensajeu" style='display: none;'>Debe seleccionar las unidades por ramo</div>
                        <label id="digite" style=' display: none; '>Digite la cantidad</label>
                        <input type="number" name="tabaco" id="unidad" style=' display: none; ' onChange="cambiar(this.value);">
                        <label>Comercializadora</label>
                        <select name="comercializadora" value="{{comercializadora}}">
                            <option>Seleccione la comercializadora</option>
                            <option>QU</option>
                            <option>GO</option>
                            <option>FX</option>
                            <option>BG</option>
                        </select>
                        <div name="mensajec" class="mensaje" id="mensajec" style='display: none;'>Debe seleccionar la comercializadora</div>
                        <label>Numero de celda</label>
                        <input type="number" name="celda" id="celda">
                        <div name="mensajecd" class="mensaje" id="mensajecd" style='display: none;'>Debe digitar el numero de celda</div>
                        <script type="text/javascript">
                        $.ajax({
                            type: "POST",
                            url: "{% url 'validarcelda' %}",
                            data: {'celda': $('#celda').val(), 
                                   'csrfmiddlewaretoken': '{{csrf_token}}'},
                            dataType: "text",
                            success: function(response) {
                                var response = $.parseJSON(response);
                                if (response.success){
                                    return true;
                                }else{
                                    alert(response.error);
                                    event.preventDefault();
                                    return false;
                                }
                            error: function(rs, e) {
                                alert(rs.responseText);
                            }
                        });
                        </script>
                        <button class="guardar" type="submit" onclick="iempaque()"> <i class="fa fa-save"></i> Guardar</button>
                        <button class="cancelar" type="reset" data-dismiss="modal"> <i class="fa fa-close"></i> Cancelar</button>
                    </form>
                </div>
                <!-- /.containerfluid -->
            </div>
        </div>
    </div>
</div>

Preguntado por: Angie Lizeth Santiago Piñeros

Qué middleware clases tienes en las settings.py?

Además creo que esto no se hace así:

'csrfmiddlewaretoken': '{{ csrf_token }}'

https://docs.djangoproject.com/en/1.10/ref/csrf/#ajax

Prueba como dice en la doc:

var csrftoken = Cookies.get('csrftoken');

'csrfmiddlewaretoken': '{{ csrf_token }}'

Con eso de arriba estas poniendo el input en el json, porque {{ csrf_token }} te genera un input hidden con el token

intenta con eso:

'csrfmiddlewaretoken': $('input[name=csrfmiddlewaretoken]').val()

El error csrf verification failed se te está originando debido a que el servidor no esta reconociendo en el cuerpo de tu solicitud el token csrf que permita validar el request que se esta ejecutando.

El detalle en tu planteamiento radica en la forma en la que estás ejecutando tu petición AJAX, ya que no se esta añadiendo el token csrf a la petición y por ende, el servidor esta respondiendo con este error.

Una de las formas de hacerlo es realizando una función que te permita añadir el token al encabezado de tu petición.

Te recomiendo que sigas los pasos suministrados en este post, que es de gran ayuda al empezar a realizar la integración AJAX-Django.

La otra opción es utilizar el método serialize de jquery para serializar toda la data del formulario (y no uno por uno, y muchos menos como estás queriendo enviar el token en tu versión actual del código), quedando tu porción de código de esta a manera:

data: $("#YOUR-FORM-ID").serialize(),.

Fuente

Related Posts:

Con Django ‘str’ object is not callable en class based-views – python django
Pregunta: Tengo este problema cuando quiero acceder a una URL que me dice que es str object is no callable seguramente tengo algo mal en ...
Publicar proyecto en Python 3.5 con heroku – python django python-3.x
Pregunta: Hola tengo un proyecto hecho con Python 3.5 y Django 1.10 y quisiera publicarlo en HEROKU pero veo que solo soporta Python 2.7, ¿alguien ...
Correcto uso de la app admin de django – python django
Pregunta: Cual es el correcto uso que se le debe dar a la página de administración (django.contrib.admin) en una aplicación en producción. explico mi pregunta. El ...
Cambiar un valor string a un entero – python django ajax
Pregunta: Con el siguiente código quiero hacer una validación donde valide si un dato que voy a ingresar es mayor a otro que ya tengo, ...
Como correr Django en python 3.5 – python python-3.x django
Pregunta: estoy trabajando con Django en python 2.7, para eso hago uso de virtualenv, pip, el conector de mysql, etc. Tengo predefinido python 3.5 en ...
¿Cómo puedo llamar una función de python desde javascript en un proyecto de django? – javascript python django
Pregunta: Estoy haciendo un proyecto que requiere hacer calculadoras complejas en python, necesito pasar datos que ingresa el usuario en la pagina web, a los ...
Django urls.py error – python nodejs django
Pregunta: Buenos días, Estoy intentando meter el 'MEDIA_ROOT' en 'urls.py' pero cuando ejecuto el 'runserver' me aparece el siguiente error: File "C:UsersManuxDesktoppd110libsite-packagesdjangoconfurlsstatic.py", line ...
Enviar y recibir parametro por medio url – Django – django django-urls
Pregunta: Tengo esta template detalle torneo , necesito enviar como parametro el id del torneo ya que al crear equipo tiene una relacion directa al ...
¿Cómo puedo entrar al admin de Django? – python django
Pregunta: Soy nuevo trabajando con Django y estoy intentando acceder al admin de Django. No encuentro la contraseña ni el usuario para acceder. ¿Saben dónde ...
¿Cómo valido datos duplicados en un campo con Django forms? – python django django-forms
Pregunta: Tengo un campo en la tabla de mi formulario que no debería recibir datos duplicados pero no sé cómo configurarlo ni dónde debería realizar ...
¿Cómo hacer una consulta de dos tablas foráneas en Django? – django django-models
Pregunta: Este es mi modelo: class Proveedores(models.Model): idproveedor=models.AutoField(primary_key=True) nombre= models.CharField(max_length=30) direccion=models.CharField(max_length=50) telefono =models.IntegerField() ...
Obtener el objeto de una llave foranea en Django – python django
Pregunta: Tengo estos modelos: class Direccion(models.Model): pais = models.CharField(max_length=30) estado = models.CharField(max_length=30) municipio = models.CharField(max_length=30) ...
¿Cómo ocultar el botón eliminar con eliminación lógica en el Django admin? – python django
Pregunta: Necesito ocultar el botón eliminar cuando estoy en la vista del detalle de un objeto en el Django admin. Estoy usando eliminación lógica de modelos ...
Mostrar datos con ListView con Django 1.8 – python django python-3.x
Pregunta: Estoy usando Django 1.8 con Python 3.4, necesito mostrar los datos de una tabla con ListView pero no me muestra nada ni me muestra ...
¿ Cómo se puede depurar los campos de formularios que django admin genera? – django django-models django-admin
Pregunta: Estoy trabajando con campos en un modelo en donde el valor de un campo depende de una opción seleccionada en un campo anterior en ...
Tags:

Add a Comment

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *