首页 > 解决方案 > 为什么 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)

标签: pythondjangodjango-formsdjango-views

解决方案


推荐阅读