2009-09-03 12 views
9

मेरे URLconf इस पैटर्न शामिल हैं:Django 'url' टेम्पलेट टैग त्रुटि

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

और मैं इस तरह यूआरएल टैग के साथ उल्टा करने के लिए है कि एक टेम्पलेट में की कोशिश कर रहा है:

<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 पैटर्न से मेल खाता है, विचार नहीं, इसलिए यह नहीं है एक दृश्य के पैरामीटर क्या है या नहीं है इसके बारे में पता है। तो इससे पता चलता है कि आपको उपर्युक्त पैटर्न के लिए regexp में नामित समूह "अगला_पृष्ठ" बनाना है, जो आप कर सकते हैं, लेकिन रीडायरेक्ट को संभालने का एक आसान तरीका है ...

django.contrib.auth.views.logout पर देखकर, आप देख सकते हैं "next_page" पैरामीटर की अनुपस्थिति में, दृश्य किसी भी अनुरोध में जो भी यूआरएल प्रदान किया जाता है, उसे रीडायरेक्ट करता है। जीईटी या अनुरोध। कुंजी "redirect_field_name" के साथ पोस्ट करें, एक पैरामीटर जो "REDIRECT_FIELD_NAME" पर डिफ़ॉल्ट है जो बदले में स्ट्रिंग पर डिफ़ॉल्ट होता है " आगामी"। तो अपना urlconf जिस तरह से है, आप इसे अपने टेम्पलेट में कुछ कर सकते हैं:

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

बहुत सराहना की। निश्चित नहीं है कि मैंने REDIRECT_FIELD_NAME को कैसे अनदेखा किया। – saturdayplace

5

असल में डीजेंगो का यूआरएल प्रेषक urlconf को देख रहा है और यह तर्क और कह रहा है, "मुझे नहीं पता कि यह तर्क कहां रखना है" क्योंकि यह यूआरएल को इंगित करने वाले दृश्य कार्यों को नहीं देखता है, केवल urlconf और इसमें पैटर्न।

अभी इस तर्क के लिए आपके यूआरएल पैटर्न में कोई जगह नहीं है।

यानी आप अतिरिक्त तर्कों के साथ 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"), 

आशा है कि मदद करता है!

संबंधित मुद्दे