2017-05-03 40 views
0

我有一個項目,需要重定向傳統的URL到新的URL(我需要保持一段時間)... 我使用RedirectView類來做到這一點,但我必須設置的網址很難-coded。如何編輯RedirectView的kwargs?

我的代碼是這樣的:

class LegacyParlamentarDetailRedirectView(RedirectView): 
    permanent = True 
    url = '/parlamentar/%s' 
    def get(self, request, *args, **kwargs): 
     pk = request.GET.get('cod_parlamentar', '') 
     self.url = self.url % (pk) 

     return super(LegacyParlamentarDetailRedirectView, self).get(self, request, *args, **kwargs) 

我想要做的就是使用pattern_name屬性,這樣我就不必寫的網址,但我需要的變量PK添加到kwargs列表(類似這樣):

class LegacyParlamentarDetailRedirectView(RedirectView): 
    permanent = True 
    pattern_name = 'parlamentar_detail' 
    def get(self, request, *args, **kwargs): 
     kwargs['pk'] = request.GET.get('cod_parlamentar', '') 

     return super(LegacyParlamentarDetailRedirectView, self).get(self, request, *args,) 

任何人都可以幫我嗎?

+1

我會註釋掉'永久= TRUE;直到你確信該重定向工作。你不希望你的瀏覽器存儲不正確的重定向。 – Alasdair

+0

@Alasdair,每當我測試的時候,我把這個值改成False。 –

回答

1

在方法簽名中包含self,但在調用該方法時不包含該方法。

如果你想添加pk現有kwargs,那麼你應該做的:

def get(self, request, *args, **kwargs): 
    kwargs['pk'] = request.GET.get('cod_parlamentar', '') 
    return super(LegacyParlamentarDetailRedirectView, self).get(request, *args, **kwargs) 

如果你想忽略現有kwargs那麼你應該將其更改爲:

def get(self, request, *args, **kwargs): 
    kwargs = {'pk': request.GET.get('cod_parlamentar', '')} 
    return super(LegacyParlamentarDetailRedirectView, self).get(request, *args, **kwargs) 

注意當您從GET參數中缺少cod_parlamentar時,您需要處理錯誤。

從你所示的代碼,我認爲這將是更清楚,如果你推翻get_redirect_url代替:

from django.urls import reverse 
# from django.core.urlresolvers import reverse # Django 1.9 and earlier 

class LegacyParlamentarDetailRedirectView(RedirectView): 
    permanent = True 

    def get_redirect_url(self): 
     return reverse('parlamentar_detail', kwargs={'pk': self.request.GET.get('cod_parlamentar', ''}) 
+0

你最後的解決方案滿足我的需求(使用'get_redirect_url')。我只是不得不將'request.GET.get'改爲'self.request.get.get',並且它完美地工作。 –

+0

請更正此問題,以便我可以接受您的回覆。 –

+1

好點,固定:) – Alasdair