20

私は 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>

結果.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>

ビュー.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))

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

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

4

2 に答える 2

32

あなたindex.htmlはなしでレンダリングされますRequestContext。これを試して:

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});
于 2012-10-24T11:28:20.483 に答える