Django - {% csrf token %} использовался в шаблоне, но контекст не предоставил значение

Я новичок в Django, и я все еще пытаюсь разобраться с его функциями. Я создал очень простой проект с Джанго 1.4.2 который имеет индексную страницу с простой формой, где вы вводите что-то и страницу результатов, где ваш ввод отображается после отправки (код ниже).

после отправки я получаю сообщение об ошибке 403 и следующее сообщение:

в шаблоне использовался {% csrf_token%}, но контекст не использовался укажите значение. Это обычно вызвано не использованием Объекта RequestContext. предупреждение.warn ("a {% csrf_token %} использовался в шаблон, но контекст не предоставил значения. Это обычно вызвано не использованием RequestContext.")

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

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))

Я просмотрел документацию и различные примеры в интернете, но я не понимаю что я делаю не так. Если я отключу Джанго.промежуточное программное обеспечение.CSRF-атаку.CsrfViewMiddleware в settings.py, я получаю именно то, что хочу, но это не тот ответ, который я ищу.

Я ценю помощь от более опытных ниндзя Django: -)

1 ответов


код 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')

из docs:

render() совпадает с вызовом render_to_response () с аргумент context_instance, который заставляет использовать RequestContext.

редактировать:

спасибо @nerdwaller за упоминание, новые версии теперь необходимо:

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