如何编辑RedirectView的kwargs?

时间:2017-05-03 21:26:14

标签: python django django-class-based-views

我有一个项目需要将旧网址重定向到新网址(我需要保留一段时间)... 我正在使用RedirectView类来执行此操作,但我必须设置硬编码的URL。

我的代码是这样的:

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属性,所以我不必编写url,但我需要将变量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 个答案:

答案 0 :(得分: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', ''})