web-dev-qa-db-fra.com

Django - {% csrf_token%} a été utilisé dans un modèle, mais le contexte n'a pas fourni la valeur

Je suis nouveau sur Django et j'essaie toujours de comprendre ses fonctionnalités. J'ai créé un projet très simple avec Django 1.4.2 qui a page d'index avec un formulaire simple où vous entrez quelque chose et une page de résultats où votre entrée est affichée après la soumission (le code est ci-dessous).

Après la soumission, j'obtiens l'erreur 403 et le message suivant:

Un {% csrf_token%} a été utilisé dans un modèle, mais le contexte n'a pas fourni la valeur. Cela est généralement dû à la non-utilisation de RequestContext. warnings.warn ("Un {% csrf_token%} a été utilisé dans un modèle, mais le contexte n'a pas fourni la valeur. Cela est généralement dû au fait de ne pas utiliser RequestContext.")

index.html

<!DOCTYPE html>
<head>
    <title>Index page</title>
</head>
<body>
    <div id="header">Welcome to index page</div>
    <div id="content">
        <p>Enter your name</p>
        <form action="/result/" method="post" accept-charset="utf-8">{% csrf_token %}
            <input type="text" name="answer">
            <input type="submit" value="Send!">
        </form>
    </div>
</body>

result.html

<!DOCTYPE html>
<head>
    <title>Result page</title>
</head>
<body>
    <div id="header">Here is the result</div>
    <div id="content">
        <p>Your name is: {{ answer }}</p>
    </div>
</body>

views.py

from Django.http import HttpResponse
from Django.shortcuts import render_to_response
from Django.template import RequestContext

def index(request):
    return render_to_response('index.html')

def result(request):
    p = request.POST['answer']
    return render_to_response('result.html', {'answer': p}, context_instance=RequestContext(request))

J'ai regardé la documentation et divers exemples sur Internet, mais je ne comprends pas ce que je fais mal. Si je désactive Django.middleware.csrf.CsrfViewMiddleware in settings.py, j'obtiens exactement ce que je veux, mais ce n'est pas la réponse que je cherche.

J'apprécie l'aide de Django ninjas :-) plus expérimentés)

16
Tubeless

Votre index.html est rendu sans RequestContext. Essaye ça:

def index(request):
    return render_to_response('index.html', context_instance=RequestContext(request))

Je vous recommande également d'utiliser un raccourci plus pratique render :

from Django.shortcuts import render

def index(request):
    return render('index.html')

Depuis les documents:

render () est identique à un appel à render_to_response () avec un argument context_instance qui force l'utilisation d'un RequestContext.

[~ # ~] modifier [~ # ~] :

Merci @ nerdwaller pour avoir mentionné, les nouvelles versions ont maintenant besoin:

render(request, 'index.html', {params});
31
Sergey Goliney