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