BaseModelFormSet __init__() 收到意外的关键字参数

4 投票
1 回答
2102 浏览
提问于 2025-04-18 02:48

我在尝试把我的内联表单集设置成至少第一行是必填的时候,遇到了上面的错误。(请查看这里的StackOverflow问题)

我现有的代码如下:

#views.py
def application(request, job_id):
    job = get_object_or_404(Job, pk=job_id)
    #return 404 if job isn't yet published
    if (job.pub_date>timezone.now() or job.close_date<timezone.now()):
        return HttpResponseNotFound('<h1>Job not found</h1>')

    #create all the inlineformsets (can_delete) set to false as will always be empty upon population
    EducationInlineFormSet = inlineformset_factory(Applicant, Education, extra=1, can_delete=False)
    QualificationInlineFormSet = inlineformset_factory(Applicant, Qualification, extra=1, can_delete=False)
    EmploymentInlineFormSet = inlineformset_factory(Applicant, Employment, extra=1, can_delete=False)

    if request.method == 'POST':
        applicant = Applicant(job=job)
        form = ApplicantForm(request.POST, instance=applicant)
        bottom_form = ApplicantFormBottom(request.POST, instance=applicant)
        education_formset = EducationInlineFormSet(request.POST, instance=applicant)
        qualification_formset = QualificationInlineFormSet(request.POST, instance=applicant)
        employment_formset = EmploymentInlineFormSet(request.POST, instance=applicant)

        #check all of the forms and formsets are valid
        if form.is_valid() and bottom_form.is_valid() and education_formset.is_valid() and qualification_formset.is_valid() and employment_formset.is_valid():
            # save the model to database, directly from the form:
            form.save()
            bottom_form.save()
            education_formset.save()
            qualification_formset.save()
            employment_formset.save()
            return render(request, 'jobs/success.html')


    else:
        applicant = Applicant(job=job)
        form = ApplicantForm(instance=applicant)
        bottom_form = ApplicantFormBottom(instance=applicant)
        education_formset = EducationInlineFormSet(instance=applicant)
        qualification_formset = QualificationInlineFormSet(instance=applicant)
        employment_formset = EmploymentInlineFormSet(instance=applicant)


    c = { 
    'job' : job,
    'form' : form ,
    'bottom_form' : bottom_form,
    'education_formset' : education_formset,
    'qualification_formset' : qualification_formset,
    'employment_formset' : employment_formset,
    }
    return render(request, 'jobs/application.html', c)

为了自定义这个表单集,我定义了以下内容:

class BaseFormSet(BaseModelFormSet):
    def __init__(self, *args, **kwargs):
        super(BaseFormSet, self).__init__(*args, **kwargs)
        for form in self.forms:
            form.empty_permitted = False

然后像这样使用它:

EducationInlineFormSet = inlineformset_factory(Applicant, Education, extra=1, can_delete=False, formset=BaseFormSet)

这导致了上面的错误,虽然我查阅了很多资料,但还是不明白如何继续将一个实例传递给表单集。

任何帮助都将非常感谢。

祝好,

克里斯。

1 个回答

5

我遇到过类似的问题,问题出在自定义的表单集合上。

你可以尝试从 BaseInlineFormSet 这个类去继承,而不是 BaseModelFormSet

这里有一段相关的内容来自于文档

撰写回答