2012-10-05 43 views
5
$.ajax({ 
    url:'/', 
    type: "POST", 
    data: {name: 'name', age: 'age'}, 
    success:function(response){}, 
    complete:function(){}, 
    error:function (xhr, textStatus, thrownError){} 
}); 

Y en views.py:Django jQuery solicitud POST

class SomeView(generic_views.TemplateView): 
    template_name = 'something.html' 

    def get(self, request, *args, **kwargs): 
     ...something... 
     return self.render_to_response(context) 

    def post(self, request, *args, **kwargs): 
     name = request.POST['name'] 
     age = request.POST['age'] 
     ...something... 

Y consigo: [05/Oct/2012 12:03:58] "POST/algo/HTTP/1.1" 403 2294

Me gustaría enviar estos datos (nombre y edad) a través de jQuery a esta función de publicación en "SomeView". Esta es la misma vista que la plantilla cargada, solo el tipo de solicitud es diferente. En get() la plantilla se carga y en la publicación, se debe invocar a la función post(). ¿Es posible? Revisé otras preguntas y obtuve esta solución. Se suponía que estaba funcionando. ¿Qué estoy haciendo mal?

Respuesta

8

La respuesta a su pregunta lo que está haciendo mal, es : ¡no mucho!

Django devuelve una respuesta 403 (Prohibida) si una solicitud POST entrante falla las comprobaciones de Csrf. Usted puede hacer esto a través de jQuery ajaxSetup, fragmentos de código se encuentran here

La razón de que esto funciona en una petición GET, es simplemente que las peticiones GET no se comprueban por el middleware CSRF.

Como parece que está creando un formulario aquí, otra cosa a considerar es usar formularios basados ​​en clases. Ellos manejan get/post y también la validación de parámetros para usted. Muy aseado. Especialmente cuando está creando formularios para editar/crear/eliminar instancias de modelos, en cuyo caso puede aprovechar el poder de ModelForms y CreateViews. Muy aseado.

Puede tomar algún tiempo para familiarizarse con las vistas genéricas basadas en clases. Pero vale la pena.

+0

en otros sitios que estoy usando FormView. Pero en este caso no puedo (larga historia). :) Ahora funciona, pero en la terminal veo [05/Oct/2012 15:08:11] "POST/algo/HTTP/1.1" 500 9499 – premik91

+0

500 es simplemente un error del servidor. Esto puede deberse a un error de Python en su método de publicación. –

+0

Pero eso debería mostrarse ya que estoy en modo de depuración, ¿no es así? – premik91

6

Necesita incluir un token CSRF (falsificación de solicitudes entre sitios) en su llamada ajax. Esto está bien documentado aquí: https://docs.djangoproject.com/en/dev/ref/contrib/csrf/

o, si desea utilizar una solución rápida, utilice el decorador @csrf_exempt para la vista:

from django.views.decorators.csrf import csrf_exempt 

@csrf_exempt 
def my_view(request): 
    ... 
+0

Gracias hombre :) Sí – premik91

2

Dentro de una plantilla de Django puede añadir esta ...

{% csrf_token %} 

Qué seria algo como esto a su página html ...

<input type="hidden" name="csrfmiddlewaretoken" value="ckhUdNOTj88A...hfTnREALlks2kz"> 

Luego, utilizando Javascript sólo tiene que encontrar a este ingrese y obtenga su valor - algo así como este ejemplo no jQuery ...

var el = document.getElementsByName("csrfmiddlewaretoken"); 
csrf_value = el[0].getAttribute("value"); 

Por último, agregue la c srf_value a la línea de datos del formulario de post jQuery AJAX así ...

data: {name: 'name', age: 'age', csrfmiddlewaretoken: csrf_value}, 

un concepto jsFiddle trabajar aquí: https://jsfiddle.net/vdx1Lfpc/18/

Cuestiones relacionadas