Django - 在设置中使用反向 url 映射
Posted
技术标签:
【中文标题】Django - 在设置中使用反向 url 映射【英文标题】:Django - use reverse url mapping in settings 【发布时间】:2010-12-03 20:21:06 【问题描述】:django 设置文件中的一些选项是 url,例如 LOGIN_URL
和 LOGIN_REDIRECT_URL
。是否可以避免对这些 url 进行硬编码,而是使用反向 url 映射?目前,这确实是我发现自己在多个地方编写相同网址的唯一地方。
【问题讨论】:
我对此表示怀疑,因为settings.py
是在 URL 模块之前加载的。不过有兴趣了解一下。好问题。
【参考方案1】:
Django 1.5 及更高版本
从 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
对于 Django 1.4,您可以使用 reverse_lazy
LOGIN_URL = reverse_lazy('login')
Django 1.3 及更早版本
这是原来的答案,在 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/'
【讨论】:
啊,很好的解决方案,我没有考虑从设置-> urls,只是反过来。 +1 如果您的 django 应用程序部署在 example.com/root 而不是 example.com,您能否避免对 django 根目录进行硬编码,以便 /accounts/login 解析为 /root/accounts/login / ? @gozzilli - 从 Django 1.4 开始,我会使用reverse_lazy
而不是将 settings.LOGIN_URL
导入到网址中。我已经更新了答案。
对于使用 Django 2.1 的我来说,带有 url 模式名称的 LOGIN_URL_REDIRECT 不起作用。它给了我一个 404 错误和 'path':'name_of_url'。有什么改变吗?在文档中我找不到任何东西。
@tobit 请提出新问题,您没有提供足够的信息来说明问题所在。 Django 2.1 中不应该有任何影响这一点的变化。【参考方案2】:
在 django 开发版本中 reverse_lazy() 成为一个选项: https://docs.djangoproject.com/en/dev/ref/urlresolvers/#reverse-lazy
【讨论】:
计划在 2012 年 3 月发布 te 1.4以上是关于Django - 在设置中使用反向 url 映射的主要内容,如果未能解决你的问题,请参考以下文章