Django KeyError kwargs.pop('pk')

Django KeyError kwargs.pop('pk')

我在 Django 1.9 和 CreateView 中使用 CBV,当我尝试使用 self.kwargs.pop('pk') 将附加参数 ('pk') 传递到我的表单时,我得到了 "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 键错误:'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() 上缺少参数或者哪个是最佳实践。

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

所以不要用pop;但是,正如我所说,根本不要这样做。您真正需要覆盖的唯一内容是 get_form.