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

Posted

技术标签:

【中文标题】Django - 在设置中使用反向 url 映射【英文标题】:Django - use reverse url mapping in settings 【发布时间】:2010-12-03 20:21:06 【问题描述】:

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

【问题讨论】:

我对此表示怀疑,因为settings.py 是在 URL 模块之前加载的。不过有兴趣了解一下。好问题。 【参考方案1】:

Django 1.5 及更高版本

从 Django 1.5 开始,LOGIN_URLLOGIN_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 映射的主要内容,如果未能解决你的问题,请参考以下文章

Django之URL反向解析

Django- 反向生成url

django系列3.1--url的命名和反向解析

Django之反向生成url

django的url反向解析

Django的urls(路由)