Django - 在设置中使用反向URL映射

TM.*_*TM. 38 python django url dry

django设置文件中的一些选项是url,例如LOGIN_URLLOGIN_REDIRECT_URL.是否可以避免硬编码这些网址,而是使用反向网址映射?目前,这是我发现自己在多个地方写同一个网址的唯一地方.

Ala*_*air 53

Django 1.5及更高版本

作为Django的1.5,LOGIN_URLLOGIN_REDIRECT_URL接受名为URL模式.这意味着您无需在设置中对任何网址进行硬编码.

LOGIN_URL = 'login'  # name of url pattern
Run Code Online (Sandbox Code Playgroud)

对于Django 1.5 - 1.9,您也可以使用视图函数名称,但不建议这样做,因为它在Django 1.8中已弃用,在Django 1.10+中不起作用.

LOGIN_URL = 'django.contrib.auth.views.login' # path to view function
Run Code Online (Sandbox Code Playgroud)

Django 1.4

对于Django 1.4,你可以使用 reverse_lazy

LOGIN_URL = reverse_lazy('login')
Run Code Online (Sandbox Code Playgroud)

Django 1.3及更早版本

这是最初的答案,之前有效的reverse_lazy是添加到Django

在urls.py中,导入设置:

from django.conf import settings
Run Code Online (Sandbox Code Playgroud)

然后添加url模式

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

请注意,您需要切片LOGIN_URL以删除前导斜杠.

在shell中:

>>>from django.core.urlresolvers import reverse
>>>reverse('login')
'/accounts/login/'
Run Code Online (Sandbox Code Playgroud)


Bas*_*ans 13

在django开发版中,reverse_lazy()成为一个选项:https: //docs.djangoproject.com/en/dev/ref/urlresolvers/#reverse-lazy