2009-09-03 7 views
9

私のURLconfは、このパターンが含まれていますジャンゴ「URL」テンプレートタグエラー

url(r'^accounts/logout/$','django.contrib.auth.views.logout', name="logout"), 

そして、私はこのようなURLタグをテンプレートにそれを逆にしようとしました:

<a href="{% url logout next_page=request.path %}">logout</a> 

しかし、私次のエラーを取得しておいてください。

Reverse for 'logout' with arguments '()' and keyword arguments '{'next_page': u'/first-page/child/'}' not found 

私はdjango.contrib.auth.views.logoutはオプションを取ることになっていると思ったnext_pageパラメータ。私は何か明白なものを見逃していると確信していますが、それが何であるか分かりません。

答えて

7

はい、あなたdjango.contrib.auth.views.logoutはオプションの "next_page"パラメータを受け入れますが、 "url"タグはビューではなくurlconfパターンと一致することを忘れないでください。ビューのパラメータであるかどうかを認識します。だからこれはあなたができる上記のパターンの正規表現で "next_page"という名前のグループを作る必要があることを示唆していますが、リダイレクトを扱う簡単な方法があります...

django.contrib.auth.views.logoutを見ると、 "next_page"パラメータがない場合、ビューはどちらかのurlがrequest.GETまたはrequest.POSTのキー "redirect_field_name"で指定されたものにリダイレクトします。デフォルトのパラメータは "REDIRECT_FIELD_NAME"で、デフォルトは "次"。あなたのテンプレートをそのまま残しておくと、あなたのテンプレートに次のようなことができます:

<a href='{% url logout %}?next={{ request.path }}'>logout</a> 
+0

非常に高く評価されています。私がREDIRECT_FIELD_NAMEをどのように見落としたかわかりません。 – saturdayplace

5

基本的にDjangoのURLディスパッチャはurlconfとその引数を見て、 "私はこの引数をどこに置くべきかわかりません"と言っています。なぜなら、urlsが指すビュー関数を見ないからです。それのパターン。

現在、その引数のURLパターンには場所がありません。

つまり、独自のパターンを書く場合や独自のビューから呼び出す場合は、デフォルトのURLパターンからではなく、余分な引数を指定してdjango.contrib.auth.views.logoutを呼び出すことができます。

これらのURLパターンの一つはあなたのために働くかもしれない(テストしていません):

url(r'^accounts/logout/(?P<next_page>.*)?$','django.contrib.auth.views.logout', name="logout"), 
url(r'^accounts/logout/$','django.contrib.auth.views.logout', kwargs={'next_page':None}, name="logout"), 

役に立てば幸い!