Débutant à Django ici, cela fait longtemps que j'essaie de résoudre ce problème …… .J'ai bien 'Django.middleware.csrf.CsrfViewMiddleware' dans mes classes de middleware et j'ai le jeton dans mon formulaire de publication.
Heres mon code, qu'est-ce que je fais 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, }, )
Voici mon modèle:
{% block content %}
<h1>Register</h1>
<form action="" method="POST"> {% csrf_token %}
{{ form.as_p }}
<input type="submit" value="Submit">
</form>
{% endblock %}
Je suppose que vous avez la balise dans le modèle mais qu'elle ne rend rien (ou voulez-vous dire que vous avez confirmé dans le code HTML réel qu'un jeton CSRF est en cours de création?)
Utilisez soit RequestContext
au lieu d'un dictionnaire
render_to_response("foo.html", RequestContext(request, {}))
Ou assurez-vous d’avoir Django.core.context_processors.csrf
dans votre réglage CONTEXT_PROCESSORS
.
Ajoutez juste ceci à vos vues
return render_to_response("register.html", {'form': form, }, context_instance = RequestContext(request))
Ça va marcher!!
Essayez d’utiliser render au lieu de render_to_response:
from Django.shortcuts import render
render(request, "foo.html", {})
Django - quelle est la différence entre render (), render_to_response () et direct_to_template ()?
Comme indiqué dans le lien ci-dessus, il a été introduit dans Django 1.3 et utilise automatiquement RequestContext.
L'ajout de RequestContext
est la clé lors de l'utilisation de render_to_response
comme mentionné par @Yuji 'Tomita' Tomita et @Njogu Mbau. Toutefois, lorsque je me suis débattu avec ce problème, j’ai dû commencer par ajouter RequestContext
à la fonction dans views.py
qui charge initialement le modèle et à la fonction dans views.py
qui gère la soumission à partir du modèle.
Aussi, juste pour référence, voici quelques autres liens qui discutent de ce même problème
Si vous n'utilisez pas CsrfViewMiddleware, vous devez utiliser csrf_protect sur toutes les vues utilisant la balise de modèle csrf_token, ainsi que sur celles acceptant les données POST.
Également eu cette erreur au hasard sur certaines pages après avoir installé Django-livereload-server. Désinstaller Django-livereload-server a fait l'affaire.