2014-01-25 42 views
1

短的反向註冊這樣RedirectView的URL和可選ARGS

url('^authorize/?$',login_required(Capture.as_view()), name='capture'), 

我已經導入這個URL配置在命名空間=「的oauth2」 在我看來,這工作得很好:

class RedirectToCapture(RedirectView): 
    pattern_name = 'oauth2:capture' 

    def get_redirect_url(self, *args, **kwargs): 
     return super(RedirectToCapture,self).get_redirect_url(*args,**kwargs) 

這將失敗反向()的URL,因爲有上述

class RedirectToCapture(RedirectView): 
    pattern_name = 'oauth2:capture' 

    def get_redirect_url(self, *args, **kwargs): 
     kwargs['response_type'] = 'code' 
     return super(RedirectToCapture,self).get_redirect_url(*args,**kwargs) 

在URLPATTERN中沒有定義的可選參數本hack工作

class RedirectToCapture(RedirectView): 
    pattern_name = 'oauth2:capture' 
    query_string = True 

    def get_redirect_url(self, *args, **kwargs): 
     self.request.META['QUERY_STRING'] = urlencode({'response_type' :'code') 
     return super(RedirectToCapture,self).get_redirect_url(*args,**kwargs) 

這是超級難看。另一種方法,做reverse()我自己並省略pattern_name

class RedirectToCapture(RedirectView): 
    def get_redirect_url(self, *args, **kwargs): 
     self.url = reverse('oauth2:capture') + '?' + urlencode({'response_type' :'code' }) 
     return super(RedirectToCapture,self).get_redirect_url(*args,**kwargs) 

這是最乾淨的方式嗎? 以任何方式觸摸args或kwargs導致reverse()停止匹配

PS:是的,我想在這裏使用基於類的視圖派生自RedirectView爲多個不相關的原因。我知道我可以簡單地做http.HttpResponseRedirect(URL)

回答

2

你非常接近那裏。在你的最終版本你可以返回,而不是調用超級鏈接。

class RedirectToCapture(RedirectView): 
    def get_redirect_url(self, *args, **kwargs): 
     get_args = urlencode({'response_type' :'code' }) 
     return reverse('oauth2:capture') + '?' + get_args 
+1

對,看着RedirectView代碼,它確實沒有做很多其他的事情,所以這個調用是毫無意義的。 它確實使用 URL =「%s嗎?%的」%(URL,參數) 這似乎是更好的首選風格所以我想我會做到這一點 – kert