web-dev-qa-db-fra.com

Comment passer le paramètre url à reverse_lazy dans Django urls.py

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)?

22
gakhov

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.

3
gakhov

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()),
)
20
slurms

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.

7
radtek

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'),
    ),
) 
4
Pykler

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.

1

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 <???>

0
Umur Kontacı