2

私はdjangoチュートリアルでwikiを実行しています。チュートリアルでは、csrfトークンが必須ではない場合に以前のバージョンのdjangoが使用されます。フォームに{%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
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テンプレートで(単純ではなく)を使用する場合は、最後の行は必要ありませんContext(注:render_to_response()使用Context時にdirect_to_template()使用するRequestContext

于 2011-10-06T17:40:06.487 に答える