Django KeyError kwargs.pop(' pk')

时间:2016-10-18 15:35:52

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

当我尝试使用self.kwargs.pop(' pk&#)将其他参数(' pk')传递给我的表单时,我在Django 1.9和CreateView中使用CBV 39;)我得到了#34; Key Error"但是如果我通过索引得到参数就可以了,这是我的代码:

def get_form(self, form_class=None, **kwargs):
    self.project_version_pk = self.kwargs.pop('pk')
    form = super(HRCreateView, self).get_form(form_class)
    form.fields['project_version'].queryset = form.fields['project_version'].queryset.filter(pk=self.project_version_pk)
    form.fields['project_version'].initial = self.project_version_pk
    return form

def get(self, request, *args, **kwargs):
    self.object = None
    form_class = self.get_form_class()
    form = self.get_form(form_class, pk=self.kwargs['pk'])

    return self.render_to_response(
        self.get_context_data(form=form)

我收到了这个错误:

builtins.KeyError KeyError:' pk'

File "RelationView.py", line 65, in get_form

self.project_version_pk = self.kwargs.pop('pk')

KeyError: 'pk'

但是,如果我以这种方式读取密钥它的工作原理:

def get_form(self, form_class=None, **kwargs):
    self.project_version_pk = self.kwargs['pk']
    form = super(HRCreateView, self).get_form(form_class)
    form.fields['project_version'].queryset = form.fields['project_version'].queryset.filter(pk=self.project_version_pk)
    form.fields['project_version'].initial = self.project_version_pk
    return form

我真的不明白为什么pop()上缺少参数,或者这是最好的做法。

1 个答案:

答案 0 :(得分:1)

首先,你不应该覆盖get_form。在CreateView中,Django已经为您调用get_context_data - 在get_form内。这就是你遇到问题的原因;你打电话给get_form并弹出pk,使它不再是kwargs;但Django再次在get_context_data中调用它,但是第二次它找不到pk,因为你是第一次删除它。

所以不要使用pop;但是,正如我所说,根本不要这样做。您实际需要覆盖的唯一事项是{{1}}。