0

我已经实现了djangobook 第 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>

当我转到绑定到此视图的 url 并提交我得到的表单时Forbidden(403) CSRF verification failed, Request aborted。我必须在{% csrf_token %}之后添加<form action="" method="post">并通过context_instance=RequestContext(request)才能render_to_response使其正常工作。是不是我做错了什么/我监督了一些设置,因为我不明白作者是如何在没有我必须做的更正的情况下让这个例子工作的。顺便说一句,我没有更改默认设置配置的任何内容。

4

1 回答 1

1

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

于 2013-03-23T14:32:22.403 回答