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
.
我在 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
.