Python Django KeyError kwargs.pop(';pk';)
我在Django 1.9和CreateView中使用CBV,当我尝试使用self.kwargs.pop('pk')将一个附加参数('pk')传递到表单时,我得到了“Key Error”,但如果我通过索引获得参数,它会起作用,下面是我的代码: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,
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
方法?