如何编辑 RedirectView 的 kwargs?

How can I edit the kwargs of a RedirectView?

我有一个项目需要将遗留 url 重定向到新的 url(我需要将它们保留一段时间)... 我正在使用 RedirectView class 来执行此操作,但我必须设置 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, )

谁能帮帮我?

您在方法签名中包含 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', ''})