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

19
demandé sur gakhov 2012-03-27 00:25:16

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()),
)
16
répondu slurms 2013-01-22 23:54:25

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.

6
répondu radtek 2015-12-15 11:35:41

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.

3
répondu gakhov 2012-10-14 15:38:34

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'),
    ),
) 
2
répondu Pykler 2015-07-09 16:44:27

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.

1
répondu Ignacio Vazquez-Abrams 2012-03-26 20:28:19

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

0
répondu Umur Kontacı 2012-03-26 20:47:53