当我尝试使用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()上缺少参数,或者这是最好的做法。
答案 0 :(得分:1)
首先,你不应该覆盖get_form
。在CreateView中,Django已经为您调用get_context_data
- 在get_form
内。这就是你遇到问题的原因;你打电话给get_form
并弹出pk,使它不再是kwargs;但Django再次在get_context_data中调用它,但是第二次它找不到pk,因为你是第一次删除它。
所以不要使用pop;但是,正如我所说,根本不要这样做。您实际需要覆盖的唯一事项是{{1}}。