Python Django KeyError kwargs.pop(';pk';)

Python Django KeyError kwargs.pop(';pk';),python,django,django-class-based-views,class-based-views,Python,Django,Django Class Based Views,Class Based Views,我在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,

我在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)
我得到了这个错误:

内置键错误 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\u form
——在
get\u context\u data
内部。这是您遇到问题的原因;您调用
get_form
并弹出pk,使其不再处于kwargs中;但是Django在get_context_数据中再次调用它,但是第二次它找不到pk,因为您第一次删除了它


所以不要使用流行音乐;但是,正如我所说的,不要这样做。实际上,您唯一需要覆盖的是
get\u form

好的,谢谢您的回复,但是如果我不覆盖get,我如何将
'pk'
传递到
get\u form
方法?您不需要这样做。无论如何,您都没有使用该方法的任何参数。我正在传递
'pk'
,尽管这个
表单=self.get\u表单(form\u类,pk=self.kwargs['pk'])
get
方法中,表单如何能够获得
'pk'
,而不必从其他方法传递?这是因为我对CreateView和UpdateView有相同的表单,并且我只需要在CreateView中传递
'pk'
。抱歉,也许所有这些对您来说都很明显,但我只在几个月前与Django合作过,thanx。但是
self.kwargs
与传递给该方法的kwargs不同;你根本没有使用这些。我应该如何将
'pk'
传递到
get\u form
方法?