Considérez que j'ai 1 ressource et 2 URL (disons une nouvelle et une ancienne) connectées à ce recours. Donc, je veux configurer la redirection HTTP pour l'une des URL.
Dans myapp/urls.py
J'ai:
urlpatterns = patterns('',
url(r'^(?P<param>\d+)/resource$',
'myapp.views.resource',
name='resource-view'
),
)
Dans mycoolapp/urls.py
Je veux préciser:
from Django.views.generic.simple import redirect_to
from Django.core.urlresolvers import reverse_lazy
urlpatterns = patterns('',
url(r'^coolresource/(?P<param>\d+)/$',
redirect_to,
{
'url': reverse_lazy('resourse-view',
kwargs={'param': <???>},
current_app='myapp'
),
}
),
)
La question est de savoir comment passer <param>
à la reverse_lazy
kwargs (alors, que mettre à la place de <???>
dans l'exemple ci-dessus)?
L'une des solutions possibles au problème général consiste à utiliser un modèle d'URL codé en dur au lieu de reverse_lazy
( documentation )
url(r'^coolresource/(?P<param>\d+)/$',
redirect_to,
{'url': '/%(param)s/resource'}
),
Mais, je ne l'aime pas tellement, car cela me rend plus difficile après de faire des changements possibles dans les URL.
Je ne ferais pas cela directement dans le urls.py
, J'utiliserais plutôt le RedirectView
basé sur la classe pour calculer la vue à rediriger vers:
from Django.views.generic.base import RedirectView
from Django.core.urlresolvers import reverse_lazy
class RedirectSomewhere(RedirectView):
def get_redirect_url(self, param):
return reverse_lazy('resource-view',
kwargs={'param': param},
current_app='myapp')
Ensuite, dans votre urls.py
tu peux le faire:
urlpatterns = patterns('',
url(r'^coolresource/(?P<param>\d+)/$',
RedirectSomewhere.as_view()),
)
La vue de redirection est idéale si vous utilisez une URL codée en dur, elle a remplacé redirect_to qui est désormais obsolète. Je ne pense pas que vous puissiez l'utiliser lors de la redirection et de l'inversion de urls.py. Voici ma solution, x est l'objet de réponse dans ce cas:
from Django.core.urlresolvers import reverse
from Django.http import HttpResponseRedirect
urlpatterns = patterns('',
....
url(r'^coolresource/(?P<param>\d+)/$',
lambda x, param: HttpResponseRedirect(
reverse('myapp.views.resource', args=[param])
),
name='resource-view-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.
Depuis Django 1.6 vous pouvez le faire ( Documentation ):
...
from Django.views.generic.base import RedirectView
urlpatterns = patterns('',
url(r'^coolresource/(?P<param>\d+)/$',
RedirectView.as_view(pattern_name='resource-view'),
),
)
Vous ne pouvez pas connaître ou obtenir la valeur tant que la vue n'est pas appelée, alors calculez url
à l'intérieur.
La méthode d'appariement des expressions rationnelles de Django pour les URL permet de définir et d'assigner des variables:
(?P<variable_name>...)
définit variable_name
selon le uri
appelé; donc ce que vous devez mettre est: param
au lieu de <???>