2015-07-27 13 views
8

Desidero reindirizzare il modello di URL con le variabili da urls.py.Come reindirizzare il pattern url con le variabili da urls.py in Django?

Mi riferisco allo other stackoverflow solution, ma non so quando url ha una variabile come il seguente codice.

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+)/') 
    ), 
) 

Con questo codice, Django reindirizzerà /permalink/1/foo/ a /permalink/(?P<id>\d+)/, non il /permalink/1/.

Esiste una soluzione senza utilizzare views.py?

Naturalmente conosco la soluzione utilizzando il controller, ma mi chiedo se ci sia una soluzione più semplice con l'utilizzo del pattern url.

risposta

10

Il passaggio da url='/permalink/(?P<id>\d+)/' a RedirectView non funziona, perché la vista non sostituisce gli argomenti con nome nell'URL.

Tuttavia, RedirectView consente di fornire il pattern_name anziché il url a reindirizzare a. L'url viene invertito usando gli stessi argomenti e kwarg che sono stati passati per la vista originale.

Questo funzionerà nel tuo caso, perché entrambi i modelli di URL hanno un argomento con nome, 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"), 
] 

Se il modello bersaglio URL utilizza altri argomenti, quindi non è possibile utilizzare url o pattern_name. Invece, è possibile sottoclasse RedirectView e sostituisce 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() 

Sarebbe buona norma mettere QuerystringRedirect nel vostro modulo di vista. Dovresti quindi aggiungere la visualizzazione ai tuoi pattern URL con qualcosa del tipo:

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