Djangobook示例:没有{%csrf_token%}的POST并且传递了context_instance = RequestContext(request)。怎么样?

时间:2013-03-23 14:13:32

标签: django django-csrf

我已经从djangobook, chapter 7, Tying Form objects into views实现了以下示例(我正在使用Django1.4):

# views.py

from django.shortcuts import render_to_response
from mysite.contact.forms import ContactForm

def contact(request):
    if request.method == 'POST':
        form = ContactForm(request.POST)
        if form.is_valid():
            cd = form.cleaned_data
            send_mail(
                cd['subject'],
                cd['message'],
                cd.get('email', 'noreply@example.com'),
                ['siteowner@example.com'],
            )
            return HttpResponseRedirect('/contact/thanks/')
    else:
        form = ContactForm()
    return render_to_response('contact_form.html', {'form': form})

# contact_form.html

<html>
<head>
    <title>Contact us</title>
</head>
<body>
    <h1>Contact us</h1>

    {% if form.errors %}
        <p style="color: red;">
            Please correct the error{{ form.errors|pluralize }} below.
        </p>
    {% endif %}

    <form action="" method="post">
        <table>
            {{ form.as_table }}
        </table>
        <input type="submit" value="Submit">
    </form>
</body>
</html>

当我转到与此视图关联的网址并提交表单时,我会Forbidden(403) CSRF verification failed, Request aborted。我必须在{% csrf_token %}之后添加<form action="" method="post">并将context_instance=RequestContext(request)传递给render_to_response以使其正常运行。 我做错了什么/我监督的一些设置,因为我不明白作者如何在没有我必须做出的更正的情况下使这个例子工作。顺便说一句,我没有改变默认设置配置。

1 个答案:

答案 0 :(得分:1)

Django书是使用Django 1.0或1.1编写的。版本1.2中的CSRF保护已更改,因此您需要显式插入令牌。