Rediriger vers le modèle d'url nommé directement à partir de urls.py dans django?

128

Dans Django, comment puis-je faire une simple redirection directement depuis urls.py? Naturellement, je suis un gars bien organisé, favorisant le principe DRY, donc j'aimerais obtenir la cible en fonction de son modèle d'url, plutôt que de coder en dur l'URL.

thnee
la source

Réponses:

194

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 supérieur, vous pouvez le faire:

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 permanentest passée de True à False. Pour cette raison, si vous ne spécifiez pas l' permanentargument de mot - clé, 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 faire taire cet avertissement.

thnee
la source
18
Juste une note, rappelez-vous que le RedirectView a permanent = True par défaut.
Daniel Backman
8
Vous pouvez tout rediriger! Comme ça:(r'^.*/$', RedirectView.as_view(url='http://newurl.com')),
radtek
3
RedirectView aura permanent = False par défaut dans Django 1.9.
Gravity Grave
5
Quelqu'un peut-il expliquer ce qu'est «my_named_pattern» dans l'exemple ci-dessus.
Jay Modi
1
en passant l' pattern_nameargument à RedirectViewexécute l'inverse pour vous au moment de l'appel en utilisant le nom de modèle donné. D'autres paramètres utiles incluent permanentetquery_string .
tutuDajuju
32

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 '/', cela signifie qu'il sera redirigé vers la page d'index, où vous pouvez également ajouter des modèles d'URL.

Jay Modi
la source
5
Juste une note, rappelez-vous que le RedirectViewa permanent=Truepar défaut dans les anciennes versions de Django, et permanent=Falsepar défaut dans les versions de Django> = 1.9.
Flimm
21

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),
]
Glushiator
la source
3
@Ali Les redirections permanentes ont généralement le code HTTP 301, les redirections temporaires ont généralement le code 302. Les redirections permanentes sont utilisées pour informer le navigateur des changements structurels du site. Les redirections temporaires sont utilisées pour indiquer une nouvelle page à afficher après une action dynamique côté serveur comme la connexion. Selon la documentation, permanent=Falsela valeur par défaut. Pour plus de détails, veuillez lire: docs.djangoproject.com/en/2.1/topics/http/shortcuts/#redirect developer.mozilla.org/en-US/docs/Web/HTTP/…
Glushiator
9

Cette méthode est prise en charge dans les anciennes versions de django si vous ne pouvez pas prendre en charge RedirectView

Dans view.py

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

Dans le url.py

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

Vous pouvez le rendre permanent en utilisant HttpResponsePermanentRedirect

sirFunkenstine
la source
8

J'essayais de rediriger tous les 404 vers la page d'accueil et ce qui suit a très bien fonctionné:

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