python - 为什么 CreateView 不将参数传递给表单集?
问题描述
通过将附加参数 ( employee_pk ) 从get_form_kwargs
方法传递到__init__
表单方法来覆盖表单字段查询集。我尝试了两种方法,都不起作用。
第一的:
class SkillTestCreateView(AuthorizedMixin, CreateView):
model = Skill
form_class = SkillGroupCreateForm
template_name = 'skill_create.html'
def get_form_kwargs(self):
kwargs = super().get_form_kwargs()
kwargs['employee_pk'] = self.kwargs['pk']
return kwargs
def get_context_data(self, **kwargs):
print(self.kwargs['pk']) ---> just for test print 4
context = super(SkillTestCreateView, self).get_context_data(**kwargs)
表格.py
class SkillGroupCreateForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
self.employee_pk = kwargs.pop('employee_pk', None) #
super(SkillGroupCreateForm, self).__init__(*args, **kwargs)
self.fields['technology'].required = False
if self.employee_pk:
self.fields['technology'].queryset = Technology.objects.exclude(skill__employee_id=self.employee_pk)
第二:
class SkillCreateView(AuthorizedMixin, CreateView):
model = Skill
form_class = SkillCreateForm
template_name = 'employee_info_create.html'
def get_form_kwargs(self):
kwargs = super().get_form_kwargs()
kwargs.update(employee_pk=self.kwargs['pk'])
return kwargs
表格.py
class SkillCreateForm(forms.ModelForm):
def __init__(self, *args, employee_pk=None, **kwargs):
super().__init__(*args, **kwargs)
if employee_pk is not None:
self.fields['technology'].queryset = Technology.objects.exclude(
skill__employee_id=employee_pk
)
两者都返回无
更新
我从 SkillGroupCreateForm 继承了另外 2 个表格
class SkillCreatePLanguageForm(SkillGroupCreateForm):
def __init__(self, *args, **kwargs):
super(SkillCreatePLanguageForm, self).__init__(*args, **kwargs)
self.fields['technology'].queryset = self.fields['technology'].queryset.filter(group__name="Programming language")
class SkillCreateFrameworkForm(SkillGroupCreateForm):
def __init__(self, *args, **kwargs):
super(SkillCreateFrameworkForm, self).__init__(*args, **kwargs)
self.fields['technology'].queryset = self.fields['technology'].queryset.filter(group__name="Framework")
表单集
def get_extra_framework():
return(Technology.objects.filter(group__name="Framework").count())
def get_extra_language():
return(Technology.objects.filter(group__name="Programming language").count())
SkillFrameworkFormSet = modelformset_factory(Skill, form=SkillCreateFrameworkForm,
max_num=get_extra_framework(), extra=get_extra_framework(), can_delete=False)
SkillPLanguageFormSet = modelformset_factory(Skill, form=SkillCreatePLanguageForm,
max_num=get_extra_language(), extra=get_extra_language(), can_delete=False)