web-dev-qa-db-fra.com

Jeton CSRF manquant ou incorrect

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 %}
18
arooo

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.

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

Ou ajoutez le jeton à votre contexte manuellement

22

Ajoutez juste ceci à vos vues

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

Ça va marcher!!

5
Njogu Mbau

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.

4
Kamen Tsvetkov

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

0
wingr

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.

0
Neeraj Sharma

É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.

0
lukeaus