我在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>
views.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
答案 0 :(得分:3)
您还没有完全理解第3步here:您需要使用RequestContext来确保运行上下文处理器。
return render_to_response("edit.html", {"page_name" : page_name,
"content" : content},
context_instance=RequestContext(request))
这样,您就不需要c.update(csrf(request))
位。
答案 1 :(得分: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
(不是简单的Context
),则不需要最后一行(注意:render_to_response()
在Context
使用direct_to_template()
时使用RequestContext
{{1}})