2011-11-11 60 views
15

Principiante en Django aquí, he estado tratando de solucionar esto por un largo tiempo. Tengo 'django.middleware.csrf.CsrfViewMiddleware' en mis clases de middleware y tengo el token en mi formulario de publicación.CSRF Token faltante o incorrecto

Aquí está mi código, ¿qué estoy haciendo mal?

from django.contrib.auth.forms import UserCreationForm 
from django.shortcuts import render_to_response 
from django.http import HttpResponseRedirect 
from chartsey.authentication.forms import RegistrationForm 
from django.template import RequestContext 
from django.core.context_processors import csrf 

def register(request): 

    if request.method == 'POST': 
     c = RequestContext(request.POST, {}) 
     form = RegistrationForm(c) 
     if form.is_valid(): 
      new_user = form.save() 
      return HttpResponseRedirect("/") 
    else: 
     form = RegistrationForm() 

    return render_to_response("register.html", {'form': form, },) 

Aquí es mi Plantilla:

{% block content %} 

    <h1>Register</h1> 
    <form action="" method="POST"> {% csrf_token %} 
     {{ form.as_p }} 
    <input type="submit" value="Submit"> 
    </form> 

{% endblock %} 
+0

posible duplicado de [Django: CSRF Token faltante o incorrecta] (http://stackoverflow.com/questions/8321217/ django-csrf-token-missing-or-incorrect) – lracicot

Respuesta

21

Mi conjetura es que usted tiene la etiqueta en la plantilla, pero no es la prestación de nada (o Quiso decir que usted confirmó en el código HTML real que un token CSRF es está generando?)

ya sea para uso RequestContext en lugar de un diccionario

render_to_response("foo.html", RequestContext(request, {})) 

O asegúrese de tener django.core.context_processors.csrf en su configuración CONTEXT_PROCESSORS.

https://docs.djangoproject.com/en/dev/ref/contrib/csrf/

Or add the token to your context manually

+0

¡Eso lo hizo! Todavía estoy teniendo un pequeño problema para entenderlo completamente, pero al menos ya no veo más allá y trato de cambiar las cosas al azar. Los documentos no me ayudaron demasiado, ¡muchas gracias! – arooo

+0

Este es el paso 3 en los documentos :) Los documentos de Django son increíbles si te permites profundizar un poco. ¡Buena suerte! –

+0

Muchas gracias, esto resolvió mi problema. Consejo general para todos: compruebe si el usuario render_to_response() con los parámetros correctos, lo eché a perder y le di 3 parámetros, por lo que resultó en el error anterior. – Phonebox

5

Sólo añadir esto a sus puntos de vista

return render_to_response("register.html", {'form': form, }, context_instance = RequestContext(request))

Se trabajará !!

0

Si no está utilizando CsrfViewMiddleware, entonces debe usar csrf_protect en cualquier vista que use la etiqueta de plantilla csrf_token, así como aquellas que aceptan los datos POST.

0

La adición de RequestContext es la clave cuando se usa render_to_response como se menciona en @Yuji 'Tomita' Tomita y @Njogu Mbau. Sin embargo, lo que inicialmente me sorprendió cuando estaba luchando con este problema fue que tuve que agregar RequestContext tanto a la función en views.py que inicialmente carga la plantilla como a la función en views.py que maneja el envío desde la plantilla.

Además, es sólo para referencia, aquí hay algunos otros enlaces sobre este mismo problema

0

También recibí este error al azar en algunas páginas después de instalar django-livereload-server. Desinstalar django-livereload-server hizo el truco.

-1

Lo que funcionó para mí fue comentando la línea por debajo de mi settings.py

'django.middleware.csrf.CsrfViewMiddleware'

Cuestiones relacionadas