web-dev-qa-db-ja.com

Django-テンプレートで{%csrf_token%}が使用されましたが、コンテキストは値を提供しませんでした

私はDjangoを初めて使用しましたが、まだその機能を理解しようとしています。Django 1.4.2を使用して非常に単純なプロジェクトを作成しました。何かを入力する単純なフォームのインデックスページと、送信後に入力が表示される結果ページ(コードは以下)。

送信後、エラー403と次のメッセージが表示されます。

{%csrf_token%}がテンプレートで使用されましたが、コンテキストが値を提供しませんでした。これは通常、RequestContextを使用していないことが原因です。 warnings.warn( "テンプレートで{%csrf_token%}が使用されましたが、コンテキストが値を提供していませんでした。通常、これは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))

私はインターネット上のドキュメントとさまざまな例を調べましたが、何が間違っているのか理解できません。 Django.middleware.csrf.CsrfViewMiddlewareを無効にした場合、settings.pyで正確に取得できますが、それは私が探している答えではありません。

より経験豊富なDjango忍者からの助けに感謝します:-)

16
Tubeless

君の index.htmlRequestContextなしでレンダリングされます。これを試して:

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

また、より便利なショートカット render を使用することをお勧めします。

from Django.shortcuts import render

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

ドキュメントから:

render()は、RequestContextの使用を強制するcontext_instance引数を指定したrender_to_response()の呼び出しと同じです。

[〜#〜]編集[〜#〜]

ありがとう @ nerdwaller 言及してくれて、新しいバージョンには今必要なもの:

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