2012-03-26 10 views
17

url-Parameter zu übergeben. Beachten Sie, dass ich 1 Ressource und 2 URLs (sagen wir neue und alte) mit dieser Ressource verbunden haben. Also, ich möchte HTTP-Umleitung für eine der URLs einrichten.Wie URL-Parameter in Django urls.py

In myapp/urls.py ich habe:

urlpatterns = patterns('', 
    url(r'^(?P<param>\d+)/resource$', 
         'myapp.views.resource', 
         name='resource-view' 
    ), 
) 

In mycoolapp/urls.py ich angeben möchten:

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' 
           ), 
         } 
    ), 
) 

Die Frage ist, wie <param> den reverse_lazy kwargs passieren (so, was statt <???> zu setzen im obigen Beispiel)?

Antwort

3

One die möglichen Lösungen des allgemeinen Problems ist hart codiert URL-Muster anstelle von reverse_lazy (documentation)

url(r'^coolresource/(?P<param>\d+)/$', 
         redirect_to, 
         {'url': '/%(param)s/resource'} 
), 
012 zu verwenden,

Aber ich mag es nicht so sehr, da es mich schwerer macht, mögliche Änderungen in URLs zu tun.

+0

Dokumentation Link zu sehen? Seite nicht gefunden – grgizem

+0

@grgizem der Beitrag vor einem halben Jahr erstellt .. sorry. Wie auch immer, ich habe den Link aktualisiert – gakhov

1

Sie können nicht wissen oder bekommen, was der Wert ist, bis die Ansicht aufgerufen wird, also berechnen Sie 10 darin.

0

Djangos Regex-Matching-Verfahren für URLs ermöglicht eine Variablen definieren und zuordnen:

(?P<variable_name>...) definiert variable_name auf der uri je aufgerufen wird, also, was Sie setzen müssen, ist: param statt <???>

+0

das ist nicht wahr, wie Sie die '' ist in 'kwargs' von' reverse_lazy' – gakhov

15

Ich würde dies nicht direkt in der urls.py tun, würde ich stattdessen die klassenbasierte RedirectView die Ansicht berechnen umleiten zu: diese

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

Dann in Ihrem urls.py Sie tun können:

urlpatterns = patterns('', 
    url(r'^coolresource/(?P<param>\d+)/$', 
     RedirectSomewhere.as_view()), 
) 
5

Redirect Ansicht ist groß, wenn Sie eine hart codierte uRL verwenden, es ersetzt redirect_to die jetzt veraltet. Ich denke nicht, dass du es verwenden kannst, wenn du urls.py umleite und zurücknimmst. Hier ist meine Lösung ist, x ist die Antwort Objekt in diesem Fall:

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'), 
    .... 
) 

Sie noch den Namen des URL-Muster anstelle einer Fest codierten URL mit dieser Lösung verwenden können. Der Parameter location_id aus der URL wird an die Lambda-Funktion übergeben.

+0

Dies ist die klügste Lösung hier –

2

Ab Django 1.6 können Sie dies (Documentation) tun:

... 
from django.views.generic.base import RedirectView 

urlpatterns = patterns('', 
    url(r'^coolresource/(?P<param>\d+)/$', 
     RedirectView.as_view(pattern_name='resource-view'), 
    ), 
) 
+0

Wie funktioniert das, wenn Sie Args oder Kwargs an das Muster übergeben wollen? – Flimm

+0

@Flimm diese Antwort könnte http://stackoverflow.com/a/12150035/742390 helfen – Pykler

Verwandte Themen