2009-08-18 7 views
18

Mam urls.py z tej linii:Znacznik szablonu Django: jak wysłać następną_stronę w {url auth_logout}?

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

W moim szablon Mam ten wiersz:

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

Teraz chciałbym dodać param next_page do templatetag zawartości, ale nie mogę zmusić go do działania. Próbowałem to:

{% url auth_logout request.path %}" 

... i tak:

{% url auth_logout request,request.path %} 

Ale żaden z nich nie działa. W jaki sposób mogę zapewnić funkcję z opcjonalnym parametrem next_page przy użyciu adresu URL templatetag?

Dzięki!

Odpowiedz

25

dwie rzeczy:

  1. django.contrib.auth.views.logout() przyjmuje opcjonalny next_page które nie świadczą
  2. url templatetag jest oddzielone przecinkami argumenty

Tak , najpierw zmodyfikuj swój adres URL aby zaakceptować następną stronę: Twój URLConf potrzebuje modyfikacji, aby przejść na następnej stronie, coś takiego jak dla zakodowanego na sztywno przekierowania:

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

parametryzowane i jeden wynik:

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

A potem zmodyfikować szablon przejść w next_page

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

To prawie wystarczy! Posiadanie dwóch wierszy w urls.py rozwiązuje to, ale wywołuje domyślną stronę django, gdy tylko wchodzisz do/logout /. Dodanie {'next_page': '/'} zgodnie z twoją sugestią powoduje, że przekierowanie ma miejsce we/wszystkich przypadkach, nawet jeśli podano następne. Wyświetlanie kodu źródłowego dla wylogowania wyjaśnia to zachowanie. Tak więc wygląda na to, że sparametryzowany jest używany przez znacznik szablonu, ale kodowany na stałe jest używany po kliknięciu łącza? –

25

Na co warto, używam to:

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

To zadziałało, ale pominąłem cytaty: Steve

+2

To jest najprostsze rozwiązanie. Nie rozumiem, dlaczego wszyscy wykorzystują rozwiązanie, które wymaga dodania wyspecjalizowanych wzorców adresów URL ... – Cerin

+0

@Cerin może dlatego, że trudne kodowanie nie jest dobrą praktyką. – Amyth

6

Sander Smits ma najbardziej proste rozwiązanie. W przypadku korzystania:

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

A w bardziej ogólnym przypadku należy użyć:

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

Jeśli ktoś chce rozdawać łącza HTML poprzez views.py błędu walidacji z mark_safe i tłumaczeń.

Użyłem tej części do wylogowania użytkownika, a następnie wysłania go na stronę do rekordy hasła.

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