2009-08-18 7 views
18

Ich habe eine urls.py mit dieser Zeile:Django Template-Tag: Wie sende next_page in {url auth_logout}?

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

In meinem Template-Tag habe ich diese Zeile:

<a href="{% url auth_logout %}">Logout</a> 

Nun würde Ich mag die next_page param auf die URL TemplateTag hinzuzufügen, aber ich kann es nicht zur Arbeit bringen. Ich habe dies versucht:

{% url auth_logout request.path %}" 

... und:

{% url auth_logout request,request.path %} 

Aber keiner von ihnen arbeitet. Wie kann ich die Funktion mit dem optionalen next_page-Parameter unter Verwendung des URL-Template-Tags bereitstellen?

Danke!

Antwort

25

Zwei Dinge:

  1. django.contrib.auth.views.logout() nimmt eine optionale next_page, die Sie nicht
  2. url bieten TemplateTag hat also durch Kommata getrennte Argumente

, zuerst ändern Sie Ihre URL, um next_page zu akzeptieren Ihr URLConf muss geändert werden, um auf der nächsten Seite zu übergeben, etwa so für eine hartcodierte Umleitung:

url(r'^logout/$', 'django.contrib.auth.views.logout', {'next_page': '/'}, name='auth_logout'), 

und ein parametrisierte Ergebnis:

url(r'^logout/(?P<next_page>.*)/$', 'django.contrib.auth.views.logout', name='auth_logout_next'), 

Und dann Ihre Vorlage ändern im next_page passieren

<a href="{% url auth_logout_next /some/location %}">Logout</a> 
+0

Das macht fast den Trick! Wenn du zwei Zeilen in urls.py hast, wird das Problem gelöst, aber die Django-Standard-Loutout-Seite wird angezeigt, wenn du nur/logout/eingibst. Hinzufügen {'next_page': '/'} Wie Sie vorschlagen, führt die Weiterleitung in allen Fällen, auch wenn next angegeben wird. Wenn Sie den Quellcode zum Abmelden anzeigen, wird dieses Verhalten erläutert. Es scheint also, die parametrierte wird vom Template-Tag verwendet, aber die hart-codierte on wird verwendet, wenn der Link tatsächlich angeklickt wird? –

25

Für was es wert ist, verwende ich diese:

<a href="{% url auth_logout %}?next=/">Logout</a> 
+0

Das funktionierte für mich, außer ich habe die Anführungszeichen weggelassen: Steve

+2

Dies ist die einfachste Lösung. Ich verstehe nicht, warum jeder die Lösung uplotiert, die spezielle URL-Muster hinzufügen muss ... – Cerin

+0

@Cerin vielleicht, weil Hard-Coding keine gute Praxis ist. – Amyth

6

Sander Smits die einfachste Lösung. In Ihrem Fall Gebrauch:

<a href="{% url "auth_logout" %}?next={{ request.path|urlencode }}">Logout</a> 

Und in einem allgemeineren Fall verwenden:

<a href="{% url "auth_logout" %}?next={% url "my_url" my_params |urlencode %}">Logout</a> 
0

Wenn jemand einen HTML-Link durch views.py Validierungsfehler mit mark_safe und Übersetzungen geben will.

benutzte ich diesen Teil der Benutzer abzumelden und ihn dann an das Passwort recorve Seite senden.

mark_safe(_("Error message") + '<a href="' + reverse('logout') + '?next=' + reverse('password_recover') + '">' + ugettext("Forgot password?") + '</a>')