2009-08-18 9 views
18

Ho un urls.py con questa linea:Tag modello Django: come inviare next_page in {url auth_logout}?

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

Nel mio tag template ho questa linea:

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

Ora, vorrei aggiungere il parametro next_page al templatetag URL, ma non riesco a farlo funzionare. Ho provato questo:

{% url auth_logout request.path %}" 

... e questo:

{% url auth_logout request,request.path %} 

Ma nessuno di loro opere. Come posso fornire la funzione con il parametro next_page opzionale usando l'url templatetag?

Grazie!

risposta

25

Due cose:

  1. django.contrib.auth.views.logout() accetta un next_page opzionale che non stanno fornendo
  2. url templatetag ha argomenti separati da virgole

Così , prima modifica l'url per accettare next_page Il tuo URLConf ha bisogno di modifiche per passare nella pagina successiva, qualcosa del genere per un reindirizzamento hardcoded:

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

e uno dei risultati con parametri:

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

E poi modificare il modello di passare nel next_page

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

Che quasi fa il trucco! Avere due righe in urls.py lo risolve, ma apre la pagina di default di django quando si entra/si chiude /. Aggiunta {'next_page': '/'} come suggerito fa sì che il reindirizzamento vada in tutti i casi, anche quando viene specificato il prossimo. La visualizzazione del codice sorgente per il logout spiega questo comportamento. Quindi sembra che quello parametrico sia usato dal tag del template, ma l'hard coded viene usato quando il link viene effettivamente cliccato? –

25

Per quel che vale, io uso questo:

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

Questo ha funzionato per me, tranne che ho omesso le virgolette: Steve

+2

Questa è la soluzione più semplice. Non capisco perché tutti invadono la soluzione che richiede l'aggiunta di modelli di URL specializzati ... – Cerin

+0

@Cerin forse perché l'hard-coding non è una buona pratica. – Amyth

6

Sander Smits ha la soluzione più facile. Nel vostro caso d'uso:

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

E in un caso più generale, utilizzare:

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

Se qualcuno vuole dare un collegamento HTML tramite errore di convalida views.py con mark_safe e traduzioni.

Ho usato questa parte per disconnettere l'utente e quindi inviarlo alla pagina di ripristino della password.

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