20

我是 Django 新手,我仍在努力掌握它的功能。我用Django 1.4.2创建了一个非常简单的项目,该项目具有简单形式的索引页面,您可以在其中输入内容,并在提交后显示您的输入的结果页面(代码如下)。

提交后,我收到错误 403 和以下消息:

模板中使用了 {% csrf_token %},但上下文未提供该值。这通常是由于没有使用 RequestContext 造成的。warnings.warn("模板中使用了 {% 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>

视图.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))

我查看了 Internet 上的文档和各种示例,但我不明白我做错了什么。如果我在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 回答
3

我在使用 Django 2.1 时遇到了这个错误,原来它是由在另一个 ajax 请求调用的模板中发出一个 ajax 请求引起的。因此,解决方案是将“request=request”添加到我的渲染函数中:

args = {'someargs': somevalues}
html = render_to_string(
        'my_template.html', context=args, request=request)
return HttpResponse(html)
于 2020-07-20T02:52:07.467 回答