2009-08-18 8 views
18

J'ai un urls.py avec cette ligne:Balise de modèle Django: Comment envoyer next_page dans {url auth_logout}?

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

Dans mon étiquette de modèle i ont cette ligne:

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

Maintenant, je voudrais ajouter le next_page param à la templatetag url, mais je ne peux pas le faire fonctionner. Je l'ai essayé:

{% url auth_logout request.path %}" 

... et ceci:

{% url auth_logout request,request.path %} 

Mais aucun d'entre eux fonctionne. Comment puis-je fournir la fonction avec le paramètre optionnel next_page en utilisant l'url templatetag?

Merci!

Répondre

25

Deux choses:

  1. django.contrib.auth.views.logout() prend une option next_page que vous ne fournissez pas d'
  2. templatetag url a des arguments séparés par des virgules

Alors , d'abord modifiez votre URL pour accepter next_page Votre URLConf doit être modifié pour passer à la page suivante, quelque chose comme ceci pour une redirection codée en dur:

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

et un résultat paramétrées:

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

Et puis modifier votre modèle pour passer dans le next_page

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

Cela fait presque l'affaire! Avoir deux lignes dans urls.py le résout, mais affiche la page de sortie de django par défaut en entrant simplement/logout /. L'ajout de {'next_page': '/'} comme vous le suggérez provoque la redirection d'aller/dans tous les cas, même lorsque le suivant est spécifié. L'affichage du code source pour la déconnexion explique ce comportement. Donc, il semble que le paramètre est utilisé par la balise de modèle, mais le codé en dur est utilisé lorsque le lien est effectivement cliqué? –

25

Pour ce que ça vaut, j'utiliser ceci:

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

Cela a fonctionné pour moi, sauf que j'ai omis les guillemets: Steve

+2

C'est la solution la plus simple. Je ne comprends pas pourquoi tout le monde est upvoting la solution qui nécessite l'ajout de modèles d'URL spécialisés ... – Cerin

+0

@Cerin peut-être parce que le codage dur n'est pas une bonne pratique. – Amyth

6

Sander Smits a la solution la plus facile. Dans votre cas, utilisez:

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

Et dans un cas plus général, utilisez:

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

Si quelqu'un veut donner un lien HTML par erreur de validation views.py avec mark_safe et traductions.

J'ai utilisé cette partie pour déconnecter l'utilisateur, puis l'envoyer à la page de recodage du mot de passe.

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