python - que - django csrf token
El token CSRF falta o es incorrecto (7)
Principiante en Django aquí, he estado tratando de arreglar esto por mucho tiempo. Tengo ''django.middleware.csrf.CsrfViewMiddleware'' en mis clases de middleware y tengo el token en mi formulario de publicación.
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í está mi plantilla:
{% block content %}
<h1>Register</h1>
<form action="" method="POST"> {% csrf_token %}
{{ form.as_p }}
<input type="submit" value="Submit">
</form>
{% endblock %}
Intenta usar render en lugar de render_to_response :
from django.shortcuts import render
render(request, "foo.html", {})
Django: ¿cuál es la diferencia entre render (), render_to_response () y direct_to_template ()?
Como se indica en el enlace anterior, se introdujo en Django 1.3 y utiliza automáticamente RequestContext
La adición de RequestContext
es la clave cuando se usa render_to_response
como lo mencionaron @Yuji ''Tomita'' Tomita y @Njogu Mbau. Sin embargo, lo que inicialmente me echó de menos cuando estaba luchando con este problema fue que tuve que agregar RequestContext
a la función en views.py
que inicialmente carga la plantilla y a la función en views.py
que maneja el envío desde la plantilla.
Además, solo como referencia, aquí hay otros enlaces que tratan este mismo problema.
Lo que funcionó para mí fue comentar la siguiente línea desde mi settings.py
''django.middleware.csrf.CsrfViewMiddleware''
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 acepten los datos POST.
Solo agrega esto a tus vistas
return render_to_response("register.html", {''form'': form, }, context_instance = RequestContext(request))
¡¡Funcionará!!
Supongo que tiene la etiqueta en la plantilla pero no está representando nada (¿o quiso decir que confirmó en el HTML real que se está generando un token CSRF?)
Utilice RequestContext
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
.
También obtuve este error aleatoriamente en algunas páginas después de instalar django-livereload-server. Desinstalar django-livereload-server hizo el truco.