Comment puis-je effectuer une redirection simple (par exemple, cflocation
dans ColdFusion ou header(location:http://)
pour PHP) dans Django?
C'est simple:
from Django.http import HttpResponseRedirect
def myview(request):
...
return HttpResponseRedirect("/path/")
Plus d'infos dans le official Django docs
Mise à jour: Django 1.0
Il y a apparemment une meilleure façon de faire cela dans Django en utilisant maintenant generic views
.
Exemple -
from Django.views.generic.simple import redirect_to
urlpatterns = patterns('',
(r'^one/$', redirect_to, {'url': '/another/'}),
#etc...
)
Il y a plus dans le documentation sur les vues génériques . Crédit - Carles Barrobés .
Mise à jour # 2: Django 1.3 +
Dans Django 1,5 redirect_to n'existe plus et a été remplacé par RedirectView . Crédit à Yonatan
from Django.views.generic import RedirectView
urlpatterns = patterns('',
(r'^one/$', RedirectView.as_view(url='/another/')),
)
En fonction de ce que vous voulez (c'est-à-dire si vous ne voulez pas faire de prétraitement supplémentaire), il est plus simple d'utiliser simplement redirect_to
vue générique:
from Django.views.generic.simple import redirect_to
urlpatterns = patterns('',
(r'^one/$', redirect_to, {'url': '/another/'}),
#etc...
)
Voir documentation pour des exemples plus avancés.
Pour Django 1.3+ utilisation:
from Django.views.generic import RedirectView
urlpatterns = patterns('',
(r'^one/$', RedirectView.as_view(url='/another/')),
)
Il existe en fait un moyen plus simple que d’avoir une vue pour chaque redirection - vous pouvez le faire directement dans urls.py
:
from Django.http import HttpResponsePermanentRedirect
urlpatterns = patterns(
'',
# ...normal patterns here...
(r'^bad-old-link\.php',
lambda request: HttpResponsePermanentRedirect('/Nice-link')),
)
ne cible peut être un appelable ainsi qu'une chaîne , c'est ce que j'utilise ici.
Depuis Django 1.1, vous pouvez également utiliser le raccourci plus simple redirect :
from Django.shortcuts import redirect
def myview(request):
return redirect('/path')
Il faut également un argument permanent permanent = True mot-clé.
Si vous voulez rediriger un sous-dossier entier, l'argument url
de RedirectView est en fait interpolé , vous pouvez donc faire quelque chose comme ceci dans urls.py
:
from Django.conf.urls.defaults import url
from Django.views.generic import RedirectView
urlpatterns = [
url(r'^old/(?P<path>.*)$', RedirectView.as_view(url='/new_path/%(path)s')),
]
Le ?P<path>
Que vous capturez sera introduit dans RedirectView
. Cette variable capturée sera alors remplacée dans l'argument url
que vous avez donné, nous donnant /new_path/yay/mypath
Si votre chemin d'origine était /old/yay/mypath
.
Vous pouvez également faire ….as_view(url='…', query_string=True)
si vous souhaitez également copier la chaîne de requête.
Avec Django version 1.3, l'approche par classe est la suivante:
from Django.conf.urls.defaults import patterns, url
from Django.views.generic import RedirectView
urlpatterns = patterns('',
url(r'^some-url/$', RedirectView.as_view(url='/redirect-url/'), name='some_redirect'),
)
Cet exemple habite dans urls.py
Il faut se méfier. Je l'ai fait sur un serveur de développement et je voulais le changer plus tard.
Je devais vider mes caches pour le changer. Afin d'éviter cette grattage à l'avenir, j'ai été capable de le rendre temporaire de la manière suivante:
from Django.views.generic import RedirectView
url(r'^source$', RedirectView.as_view(permanent=False,
url='/dest/')),
chemin_page = définir dans urls.py
def deletePolls(request):
pollId = deletePool(request.GET['id'])
return HttpResponseRedirect("/page_path/")
Vous pouvez le faire dans la section Admin. C'est expliqué dans la documentation.
https://docs.djangoproject.com/en/dev/ref/contrib/redirects/
Cela devrait fonctionner dans la plupart des versions de Django, je l'utilise dans la 1.6.5:
from Django.core.urlresolvers import reverse
from Django.http import HttpResponseRedirect
urlpatterns = patterns('',
....
url(r'^(?P<location_id>\d+)/$', lambda x, location_id: HttpResponseRedirect(reverse('dailyreport_location', args=[location_id])), name='location_stats_redirect'),
....
)
Vous pouvez toujours utiliser le nom du modèle d'URL au lieu d'une URL codée en dur avec cette solution. Le paramètre location_id de l'URL est transmis à la fonction lambda.