2009-09-03 11 views
9

Mi URLconf contiene este patrón:Django error 'url' etiqueta de plantilla

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

Y he tratando de revertir que en una plantilla con la etiqueta URL como esta:

<a href="{% url logout next_page=request.path %}">logout</a> 

Pero seguir recibiendo el siguiente error:

Reverse for 'logout' with arguments '()' and keyword arguments '{'next_page': u'/first-page/child/'}' not found 

pensé django.contrib.auth.views.logout se supone que tendrá una opción next_page parámetro. Estoy seguro de que me falta algo obvio, pero no estoy seguro de qué se trata.

Respuesta

7

Sí, tiene razón, django.contrib.auth.views.logout acepta un parámetro opcional "next_page", pero no olvide que la etiqueta "url" coincide con los patrones urlconf, no con las vistas, por lo que no es consciente de lo que es o no es un parámetro de una vista. Así que esto sugiere que necesita hacer "next_page" un grupo con nombre en la expresión regular para el patrón anterior, lo cual podría hacer, pero hay una forma más fácil de manejar las redirecciones ...

Al mirar django.contrib.auth.views.logout, puede ver que en ausencia de un parámetro "next_page", la vista redirecciona a cualquier url que se proporcione en request.GET o request.POST con la clave "redirect_field_name", un parámetro que de forma predeterminada es "REDIRECT_FIELD_NAME", que a su vez se predetermina a la cadena " siguiente". Entonces, dejando tu urlconf como está, puedes hacer algo como esto en tu plantilla:

<a href='{% url logout %}?next={{ request.path }}'>logout</a> 
+0

Muy apreciado. No estoy seguro de cómo pasé por alto REDIRECT_FIELD_NAME. – saturdayplace

5

Básicamente el despachador de URL de Django está mirando el urlconf y ese argumento y diciendo "No sé dónde poner este argumento" porque no mira las funciones de vista que las URL señalan, solo el urlconf y el patrones en ella.

Ahora no hay lugar en su patrón de URL para ese argumento.

es decir, puede llamar django.contrib.auth.views.logout con los argumentos adicionales si usted escribe su propio patrón para ello o si se llama desde su propio punto de vista, pero no de su patrón de URL por defecto.

Uno de estos patrones de URL podría funcionar para usted (no probado):

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"), 

espero que ayude!

Cuestiones relacionadas