2009-10-05 63 views
35

Django设置文件中的一些选项是url,例如LOGIN_URLLOGIN_REDIRECT_URL。是否有可能避免硬编码这些URL,而是使用反向URL映射?目前这确实是我发现自己在多个地方写同一个网站的唯一地方。Django - 在设置中使用反向URL映射

+2

我对此表示怀疑,因为'settings.py'是URL模块之前加载。有兴趣了解一下。很好的问题。 – 2009-10-05 05:43:38

回答

48

的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

In url s.py,导入设置:

from django.conf import settings 

然后添加URL模式

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

请注意,您需要切LOGIN_URL删除前导斜线。

在shell:

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

啊,很好的解决方案,我不考虑从设置 - >网址,只能反过来。 +1 – 2009-10-05 12:12:30

+0

您是否可以避免对django根进行硬编码,以便在example.com/root而不是example.com/上部署django应用程序时,/ accounts/login可以解析为/ root/accounts/login? – gozzilli 2013-11-06 06:23:43

+0

@gozzilli - 自从Django 1.4开始,我将使用'reverse_lazy'而不是将'settings.LOGIN_URL'导入到网址中。我已经更新了答案。 – Alasdair 2013-11-06 08:04:44

12

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

+1

+1感谢您的支持! – 2012-01-09 18:17:01

+0

计划于2012年3月发布te 1.4版 – 2012-01-18 12:44:25

+0

以下是早期版本的摘录:http://djangosnippets.org/snippets/499/ – 2012-02-01 00:54:48