2015-07-27 8 views
8

Ich möchte URL-Muster mit Variablen von urls.py umleiten.Wie URL-Muster mit Variablen aus urls.py in Django umleiten?

Ich verweise other stackoverflow solution, aber ich weiß nicht, wenn URL eine Variable wie folgenden Code hat.

from django.conf.urls import patterns, url 
from django.views.generic import RedirectView 


urlpatterns = patterns(
    url(
     r'^permalink/(?P<id>\d+)/foo/$', 
     RedirectView.as_view(url='/permalink/(?P<id>\d+)/') 
    ), 
) 

Mit diesem Code wird django /permalink/1/foo/ zu /permalink/(?P<id>\d+)/ umleiten, nicht die /permalink/1/.

Gibt es eine Lösung ohne views.py?

Natürlich weiß ich Lösung mit Controller, aber ich frage mich, gibt es eine einfachere Lösung mit URL-Muster verwenden.

Antwort

10

Die Übergabe von url='/permalink/(?P<id>\d+)/' an funktioniert nicht, da die Ansicht die benannten Argumente in der URL nicht ersetzt.

Mit können Sie jedoch die pattern_name anstelle der url zur Weiterleitung an. Die URL wird mit denselben Argumenten und Kwargs umgekehrt, die für die ursprüngliche Ansicht übergeben wurden.

Dies funktioniert in Ihrem Fall, weil beide URL-Muster ein benanntes Argument haben, id.

urlpatterns = [ 
    url(r'^permalink/(?P<id>\d+)/foo/$', 
     RedirectView.as_view(pattern_name="target_view"), 
     name="original_view"), 
    url(r'^permalink/(?P<id>\d+)/$', views.permalink, name="target_view"), 
] 

Wenn das Ziel URL-Muster andere Argumente verwendet, dann können Sie nicht url oder pattern_name verwenden. Stattdessen können Sie die Unterklasse und überschreiben get_redirect_url.

from django.core.urlresolvers import reverse 
from django.views.generic import RedirectView 

class QuerystringRedirect(RedirectView): 
    """ 
    Used to redirect to remove GET parameters from url 

    e.g. /permalink/?id=10 to /permalink/10/ 
    """ 

    def get_redirect_url(self): 
     if 'id' in self.request.GET: 
      return reverse('target_view', args=(self.request.GET['id'],)) 
     else: 
      raise Http404() 

Es wäre eine gute Übung QuerystringRedirect in Ihre Ansichten Modul zu setzen. Sie würden dann die Ansicht zu Ihren URL-Mustern mit etwas wie hinzufügen:

urlpatterns = [ 
    url(r'^permalink/$', views.QuerystringRedirect.as_view(), name="original_view"), 
    url(r'^permalink/(?P<id>\d+)/$', views.permalink, name="target_view"), 
] 
Verwandte Themen