Redirect to named url pattern directly from urls.py in django?

Redirect to named url pattern directly from urls.py in django?

In Django, how can I do a simple redirect directly from urls.py? Naturally I am a well organized guy, favoring the DRY principle, so I would like to get the target based on it's named url pattern, rather than hard coding the url.

Solutions/Answers:

Answer 1:

If you are on Django 1.4 or 1.5, you can do this:

from django.core.urlresolvers import reverse_lazy
from django.views.generic import RedirectView

urlpatterns = patterns('',
    url(r'^some-page/$', RedirectView.as_view(url=reverse_lazy('my_named_pattern'), permanent=False)),
    ...

If you are on Django 1.6 or above, you can do this:

from django.views.generic import RedirectView

urlpatterns = patterns('',
    url(r'^some-page/$', RedirectView.as_view(pattern_name='my_named_pattern', permanent=False)),
    ...

In Django 1.9, the default value of permanent has changed from True to False. Because of this, if you don’t specify the permanent keyword argument, you may see this warning:

RemovedInDjango19Warning: Default value of ‘RedirectView.permanent’ will change from True to False in Django 1.9. Set an explicit value to silence this warning.

Answer 2:

This works for me.

from django.views.generic import RedirectView

urlpatterns = patterns('',
    url(r'^some-page/$', RedirectView.as_view(url='/')),
    ...

In above example '/' means it will redirect to index page,
where you can add any url patterns also.

Answer 3:

for django v2+

from django.contrib import admin
from django.shortcuts import redirect
from django.urls import path, include


urlpatterns = [
    # this example uses named URL 'hola-home' from app named hola
    # for more redirect's usage options: https://docs.djangoproject.com/en/2.1/topics/http/shortcuts/
    path('', lambda request: redirect('hola/', permanent=False)),
    path('hola/', include("hola.urls")),
    path('admin/', admin.site.urls),
]

Answer 4:

This way is supported in older versions of django if you cannot support RedirectView

In view.py

def url_redirect(request):
    return HttpResponseRedirect("/new_url/")

In the url.py

url(r'^old_url/$', "website.views.url_redirect", name="url-redirect"),

You can make it permanent by using HttpResponsePermanentRedirect

Answer 5:

I was trying to redirect all 404s to the home page and the following worked great:

from django.views.generic import RedirectView
...
under urlpatterns, added:
    url(r'^.*/$', RedirectView.as_view(url='/home/')),
    url(r'^$', RedirectView.as_view(url='/home/')),

References