django « url » erreur de balise de modèle
Question
Mon URLConf contient ce modèle:
url(r'^accounts/logout/$','django.contrib.auth.views.logout', name="logout"),
Et je l'ai essayer d'inverser cette tendance dans un modèle avec la balise d'URL comme ceci:
<a href="{% url logout next_page=request.path %}">logout</a>
Mais je continue à obtenir l'erreur suivante:
Reverse for 'logout' with arguments '()' and keyword arguments '{'next_page': u'/first-page/child/'}' not found
Je pensais que django.contrib.auth.views.logout
est censé prendre un paramètre next_page
option. Je suis sûr que je manque quelque chose évidente, mais je ne suis pas sûr de ce qu'il est.
La solution
Oui, vous avez raison, django.contrib.auth.views.logout n'accepte un paramètre « next_page » en option, mais ne pas oublier que le « url » tag correspond à URLConf motifs, non vues, il est donc pas au courant de ce qui est ou non un paramètre d'une vue. Donc, cela suggère que vous devez faire « next_page » un groupe nommé dans l'expression rationnelle pour le modèle ci-dessus, vous pouvez le faire, mais il y a un moyen plus facile à gérer ... réoriente
En regardant django.contrib.auth .views.logout , vous pouvez voir qu'en l'absence d'un paramètre « next_page », la vue réoriente à ce que l'URL est fournie dans les deux request.GET ou request.POST avec la touche « redirect_field_name », un paramètre par défaut « REDIRECT_FIELD_NAME » qui par défaut à son tour à la chaîne « suivant ». Donc, en laissant votre URLconf la façon dont il est, vous pouvez faire quelque chose comme ceci dans votre modèle:
<a href='{% url logout %}?next={{ request.path }}'>logout</a>
Autres conseils
En gros répartiteur URL de Django est à la recherche à l'URLconf et cet argument en disant: « Je ne sais pas où mettre cet argument » parce qu'il ne regarde pas la vue des fonctions les urls pointent vers, seul le URLconf et les motifs en elle.
En ce moment, il n'y a pas de place dans votre modèle d'URL pour cet argument.
i.e.. vous pouvez appeler django.contrib.auth.views.logout avec les arguments supplémentaires si vous écrivez votre propre modèle pour ou si vous appelez à partir de votre propre point de vue, mais pas de son modèle d'URL par défaut.
L'un de ces modèles url pourrait fonctionner pour vous (non testé):
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"),
L'espoir qui aide!