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