web-dev-qa-db-fra.com

Rediriger vers le modèle d'URL nommé directement à partir d'urls.py dans Django?

Dans Django, comment puis-je faire une simple redirection directement à partir de urls.py? Naturellement, je suis un gars bien organisé, qui privilégie le principe DRY). Je voudrais donc obtenir la cible en fonction du motif nommé de son URL, plutôt que de coder en dur l’URL.

116
thnee

Si vous êtes sur Django 1.4 ou 1.5, vous pouvez faire ceci:

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

Si vous êtes sur Django 1.6 ou plus, vous pouvez faire ceci:

from Django.views.generic import RedirectView

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

Dans Django 1.9, la valeur par défaut de permanent est passée de True à False. De ce fait, si vous ne spécifiez pas l'argument de mot clé permanent, vous pouvez voir cet avertissement:

RemovedInDjango19Warning: la valeur par défaut de 'RedirectView.permanent' passera de True à False dans Django 1.9. Définissez une valeur explicite pour désactiver cet avertissement.

179
thnee

Cela fonctionne pour moi.

from Django.views.generic import RedirectView

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

Dans l'exemple ci-dessus, '/' _ signifie qu'il sera redirigé vers la page d'index, où vous pouvez également ajouter des modèles d'URL.

28
Jay Modi

pour 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),
]
9
Glushiator

Cette façon de faire est supportée par les anciennes versions de Django si vous ne pouvez pas supporter RedirectView

Dans la vue.py

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

Dans l'url.py

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

Vous pouvez le rendre permanent en utilisant HttpResponsePermanentRedirect

9
sirFunkenstine

J'essayais de rediriger tous les 404 vers la page d'accueil et les éléments suivants ont fonctionné à merveille:

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