سؤال

يحتوي urlconf الخاص بي على هذا النمط:

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 معامل. أنا متأكد من أنني أفتقد شيئًا واضحًا ، لكنني لست متأكدًا مما هو عليه.

هل كانت مفيدة؟

المحلول

نعم أنت على حق ، django.contrib.auth.views.logout تقبل معلمة "next_page" اختيارية ، ولكن لا تنسى أن علامة "url" تتطابق مع أنماط urlconf ، وليس وجهات النظر ، لذلك ليست على علم بما هو أم ليست معلمة عرض. لذلك يشير هذا إلى أنك تحتاج إلى جعل "Next_page" مجموعة مسموسة في RegexP للنمط أعلاه ، وهو ما يمكنك القيام به ، ولكن هناك طريقة أسهل للتعامل مع إعادة التوجيه ...

انظر الى django.contrib.auth.views.logout, ، يمكنك أن ترى أنه في حالة عدم وجود معلمة "next_page" ، يتم إعادة توجيه العرض إلى أي عنوان URL إما في request.get. الإعدادات الافتراضية إلى السلسلة "التالي". لذا ، يمكنك ترك urlconf كما هو ، يمكنك أن تفعل شيئًا كهذا في القالب الخاص بك:

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

نصائح أخرى

في الأساس ، ينظر مرسل URL الخاص بـ Django إلى URLCONF وهذا الحجة وقول "لا أعرف أين أضع هذه الوسيطة" لأنها لا تنظر إلى وظائف العرض التي تشير إليها عناوين URL ، فقط urlconf والأنماط الموجودة فيه.

الآن لا يوجد مكان في نمط عنوان URL الخاص بك لتلك الحجة.

أي يمكنك الاتصال بـ django.contrib.auth.views.logout مع الوسيطات الإضافية إذا كتبت نمطك الخاص به أو إذا قمت بتسميته من عرضك الخاص ، ولكن ليس من نمط عنوان URL الافتراضي.

قد يعمل أحد أنماط 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"),

امل ان يساعد!

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top