【发布时间】:2010-12-03 20:21:06
【问题描述】:
django 设置文件中的一些选项是 url,例如 LOGIN_URL 和 LOGIN_REDIRECT_URL。是否可以避免对这些 url 进行硬编码,而是使用反向 url 映射?目前,这确实是我发现自己在多个地方编写相同网址的唯一地方。
【问题讨论】:
-
我对此表示怀疑,因为
settings.py是在 URL 模块之前加载的。不过有兴趣了解一下。好问题。
django 设置文件中的一些选项是 url,例如 LOGIN_URL 和 LOGIN_REDIRECT_URL。是否可以避免对这些 url 进行硬编码,而是使用反向 url 映射?目前,这确实是我发现自己在多个地方编写相同网址的唯一地方。
【问题讨论】:
settings.py 是在 URL 模块之前加载的。不过有兴趣了解一下。好问题。
从 Django 1.5 开始,LOGIN_URL 和 LOGIN_REDIRECT_URL 接受命名的 URL 模式。这意味着您无需在设置中硬编码任何网址。
LOGIN_URL = 'login' # name of url pattern
对于 Django 1.5 - 1.9,您还可以使用视图函数名称,但不建议这样做,因为它在 Django 1.8 中已被弃用,并且在 Django 1.10+ 中不起作用。
LOGIN_URL = 'django.contrib.auth.views.login' # path to view function
对于 Django 1.4,您可以使用 reverse_lazy
LOGIN_URL = reverse_lazy('login')
这是原来的答案,在 reverse_lazy 添加到 Django 之前有效
在 urls.py 中,导入设置:
from django.conf import settings
然后添加url模式
urlpatterns=('',
...
url('^%s$' %settings.LOGIN_URL[1:], 'django.contrib.auth.views.login',
name="login")
...
)
请注意,您需要对 LOGIN_URL 进行切片以删除前导正斜杠。
在外壳中:
>>>from django.core.urlresolvers import reverse
>>>reverse('login')
'/accounts/login/'
【讨论】:
reverse_lazy 而不是将 settings.LOGIN_URL 导入到网址中。我已经更新了答案。
在 django 开发版本中 reverse_lazy() 成为一个选项: https://docs.djangoproject.com/en/dev/ref/urlresolvers/#reverse-lazy
【讨论】: