Comment passer le paramètre url pour inverser lazy dans Django urls.py
Considérer que j'ai 1 ressource et 2 urls (disons que le nouveau et l'ancien) connecté à ce resourse. Donc, je veux configurer la redirection HTTP pour l'une des urls.
myapp/urls.py
j'ai:
urlpatterns = patterns('',
url(r'^(?P<param>d+)/resource$',
'myapp.views.resource',
name='resource-view'
),
)
mycoolapp/urls.py
je tiens à 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 Comment passer <param>
reverse_lazy
kwargs (alors, que mettre à la place de <???>
dans l'exemple ci-dessus)?
6 réponses
je ne voudrais pas le faire directement dans le urls.py
, j'utiliserais plutôt leRedirectView
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')
alors, dans votre urls.py
vous pouvez faire ceci:
urlpatterns = patterns('',
url(r'^coolresource/(?P<param>\d+)/$',
RedirectSomewhere.as_view()),
)
La Vue de redirection est grande si vous utilisez une url codée dur, elle a remplacé redirect_to qui est maintenant dépréciée. Je ne pense pas que vous pouvez l'utiliser en redirigeant et en inversant 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 codés en dur url avec cette solution. Le paramètre location_id de l'url est transmis à la fonction lambda.
une des solutions possibles du problème général est d'utiliser un motif d'url codé 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 il me rend plus difficile après de faire des changements possibles dans les url.
A partir de Django 1.6 Vous pouvez faire ceci ( 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 savoir ou obtenir Quelle est la valeur jusqu'à ce que la vue soit appelée, donc calculez url
à l'intérieur.
la méthode de correspondance regex de Django pour les urls permet de définir et d'assigner des variables:
(?P<variable_name>...)
définit variable_name
selon le uri
être appelée, de sorte que vous devez mettre: param
au lieu de <???>