Django - {%csrf_token%}在模板中使用,但上下文没有提供值

时间:2012-10-24 11:23:42

标签: django csrf django-csrf

我是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忍者的帮助: - )

2 个答案:

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