2

我在 django 教程中做 wiki,在教程中使用 django 的早期版本,其中 csrf 令牌不是强制性的。我已将 {% csrf_token %} 添加到表单中,但是我不确定在视图中要做什么。请帮忙。

这是表格:

<form method = "POST" action="/wikicamp/{{ page_name }}/save/">{% csrf_token %}
    <textarea name = "content" rows="20" cols="60">{{ content }}</textarea><br/>
    <input type="submit" value="Save Page"/>
</form>

视图.py:

def view_page(request, page_name):
    try:
        page = Page.objects.get(pk=page_name)
    except Page.DoesNotExist:
        return render_to_response("create.html", {"page_name" : page_name})

    return render_to_response("view.html", {"page_name" : page_name,
                                            "content" : page.content})

def edit_page(request, page_name):
    c = {}
    c.update(csrf(request))
    try:
        page = Page.objects.get(pk=page_name)
        contents = page.content
    except Page.DoesNotExist:
        content = ""
    return render_to_response("edit.html", {"page_name" : page_name,
                                            "content" : content}, c)


def save_page(request, page_name):
    content = request.POST["content"]
    try:
        page = Page.objects.get(pk=page_name)
        page.content = content
    except Page.DoesNotExist:
        page = Page(name = page_name, content = content)
    page.save()

    return HttpResponseRedirect("/wikicamp/" + page_name + "/")

这是错误

TypeError at /wikicamp/start/edit/
pop expected at least 1 arguments, got 0
4

2 回答 2

3

您还没有完全理解这里的第 3 步:您需要使用 RequestContext 来确保上下文处理器运行。

return render_to_response("edit.html", {"page_name" : page_name,
                                        "content" : content},
                           context_instance=RequestContext(request))

有了它,你就不需要这个c.update(csrf(request))位了。

于 2011-10-06T17:55:16.583 回答
0

你不需要再做任何事情了。

只需{% csrf_token %}放入您的表单并通过 POST 发送即可。

所有其他的东西都会在里面完成django.middleware.csrf.CsrfViewMiddleware

你应该在你的settings.py(如果你还没有这样做的话)中启用它:

MIDDLEWARE_CLASSES += (`django.middleware.csrf.CsrfViewMiddleware`,)
TEMPLATE_CONTEXT_PROCESSORS += (`django.core.context_processors.csrf`,)

如果您在模板中使用RequestContext(不是简单的),则不需要最后一行(注意:使用时使用)Contextrender_to_response()Contextdirect_to_template()RequestContext

于 2011-10-06T17:40:06.487 回答