Django – use reverse url mapping in settings

Question:

A few of the options in the django settings file are urls, for example LOGIN_URL and LOGIN_REDIRECT_URL. Is it possible to avoid hardcoding these urls, and instead use reverse url mapping? At the moment this is really the only place where I find myself writing the same urls in multiple places.

Asked By: TM.

||

Answers:

Django 1.5 and later

As of Django 1.5, LOGIN_URL and LOGIN_REDIRECT_URL accept named URL patterns. That means you don’t need to hardcode any urls in your settings.

LOGIN_URL = 'login'  # name of url pattern

For Django 1.5 – 1.9, you can also use the view function name, but this is not recommended because it is deprecated in Django 1.8 and won’t work in Django 1.10+.

LOGIN_URL = 'django.contrib.auth.views.login' # path to view function

Django 1.4

For Django 1.4, you can could use reverse_lazy

LOGIN_URL = reverse_lazy('login')

Django 1.3 and earlier

This is the original answer, which worked before reverse_lazy was added to Django

In urls.py, import settings:

from django.conf import settings

Then add the url pattern

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

Note that you need to slice LOGIN_URL to remove the leading forward slash.

In the shell:

>>>from django.core.urlresolvers import reverse
>>>reverse('login')
'/accounts/login/'
Answered By: Alasdair

In django development version reverse_lazy() becomes an option:
https://docs.djangoproject.com/en/dev/ref/urlresolvers/#reverse-lazy

Answered By: Bas Koopmans
Categories: questions Tags: , , ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.