2009-10-05 18 views
35

Algunas de las opciones en el archivo de configuración de django son direcciones URL, por ejemplo LOGIN_URL y LOGIN_REDIRECT_URL. ¿Es posible evitar la codificación rígida de estas URL y, en su lugar, utilizar el mapeo de URL inverso? Por el momento, este es realmente el único lugar donde me encuentro escribiendo las mismas URL en varios lugares.Django: use la asignación inversa de URL en la configuración

+2

lo dudo, ya que 'settings.py' se carga antes de que el módulo de URL. Interesado en descubrirlo. Gran pregunta –

Respuesta

48

Django 1.5 y posterior

A partir de Django 1.5, LOGIN_URL y LOGIN_REDIRECT_URL aceptar nombrados patrones de URL. Eso significa que no necesita codificar ninguna URL en su configuración.

LOGIN_URL = 'login' # name of url pattern 

Para Django 1.5 a 1.9, también se puede utilizar la vista nombre de la función, pero esto no es recomendable, ya que está en desuso en Django 1.8 y no funcionará en Django 1.10+.

LOGIN_URL = 'django.contrib.auth.views.login' # path to view function 

Django 1.4

Para Django 1.4, puede podría utilizar reverse_lazy

LOGIN_URL = reverse_lazy('login') 

Django 1.3 y anteriores

Esto se le añadió la respuesta original, que trabajó antes reverse_lazy a Django

In url s.py, la configuración de importación:

from django.conf import settings 

A continuación, añadir el patrón de URL

urlpatterns=('', 
    ... 
    url('^%s$' %settings.LOGIN_URL[1:], 'django.contrib.auth.views.login', 
     name="login") 
    ... 
) 

en cuenta que necesita para cortar LOGIN_URL para quitar la barra diagonal.

En el shell:

>>>from django.core.urlresolvers import reverse 
>>>reverse('login') 
'/accounts/login/' 
+1

Ah, buena solución, no consideré pasar de configuración -> URL, solo al revés. +1 –

+0

¿Y puede evitar forzar la raíz de django para que/accounts/login se resuelva en/root/accounts/login si su aplicación django se implementa en example.com/root en vez de example.com/? – gozzilli

+0

@gozzilli: desde Django 1.4, utilizaría 'reverse_lazy' en lugar de importar' settings.LOGIN_URL' en las direcciones URL. He actualizado la respuesta. – Alasdair

12

En Django versión de desarrollo reverse_lazy() se convierte en una opción: https://docs.djangoproject.com/en/dev/ref/urlresolvers/#reverse-lazy

+1

+1 gracias por el encabezado! –

+0

Está programado para la versión te 1.4 en marzo de 2012 –

+0

Aquí hay un fragmento para versiones anteriores: http://djangosnippets.org/snippets/499/ –

Cuestiones relacionadas