我是Django的新手,我仍然试图掌握它的功能。我用 Django 1.4.2 创建了一个非常简单的项目,其中包含简单形式的索引页面,您可以在其中输入内容和结果页面,其中您的输入在提交后显示(代码如下)。
提交后,我收到错误403和以下消息:
模板中使用了{%csrf_token%},但上下文没有使用 提供价值。这通常是由于不使用而引起的 的RequestContext。 warnings.warn(“A {%csrf_token%}”用于a 模板,但上下文没有提供价值。这通常是 不使用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))
我在互联网上查看了文档和各种示例,但我不明白我做错了什么。如果我在 settings.py 中禁用 django.middleware.csrf.CsrfViewMiddleware ,我会得到我想要的内容,但这不是我正在寻找的答案。
我感谢更有经验的Django忍者的帮助: - )
答案 0 :(得分:29)
您的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()与使用a调用render_to_response()相同 context_instance参数,强制使用RequestContext。
修改强>:
感谢@nerdwaller提及,现在需要更新的版本:
render(request, 'index.html', {params});
答案 1 :(得分:1)
我在使用Django 2.1时遇到此错误,原来是由在另一个ajax请求中调用模板中的ajax请求引起的。因此,解决方案是在我的渲染函数中添加“ request = request”:
args = {'someargs': somevalues}
html = render_to_string(
'my_template.html', context=args, request=request)
return HttpResponse(html)