RedirectView和url反向使用可选的args

时间:2014-01-25 21:22:48

标签: django

简短:我正在尝试对名为url的第三方应用做一个简单的重定向视图,其中包含可选参数

第三方视图网址(来自provider.oauth2包)已按此注册

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

我在namespace ='oauth2'中导入了这个urlconf 在我看来,这很好用:

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

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

这将无法反转()url,因为上面的urlpattern中没有定义可选参数

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)

这个黑客工作

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)

1 个答案:

答案 0 :(得分:2)

你几乎就在那里。在您的最终版本中,您只需返回网址而不是调用超级。

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