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

DjangoRedirect

Django Problem Overview


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.

Django Solutions


Solution 1 - Django

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.

Solution 2 - Django

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.

Solution 3 - Django

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),
]

Solution 4 - Django

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

Solution 5 - Django

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/')),

Solution 6 - Django

You could do straight on the urls.py just doing something like:

url(r'^story/(?P<pk>\d+)/',
        lambda request, pk: HttpResponsePermanentRedirect('/new_story/{pk}'.format(pk=pk)))

Just ensure that you have the new URL ready to receive the redirect!! Also, pay attention to the kind of redirect, in the example I'm using Permanent Redirect

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionthneeView Question on Stackoverflow
Solution 1 - DjangothneeView Answer on Stackoverflow
Solution 2 - DjangoJay ModiView Answer on Stackoverflow
Solution 3 - DjangoGlushiatorView Answer on Stackoverflow
Solution 4 - DjangosirFunkenstineView Answer on Stackoverflow
Solution 5 - DjangoAnuragView Answer on Stackoverflow
Solution 6 - DjangoRodrigo CarvalhoView Answer on Stackoverflow