需要 Django 表单集

Posted

技术标签:

【中文标题】需要 Django 表单集【英文标题】:Django formsets required 【发布时间】:2010-12-10 20:25:15 【问题描述】:

如何使 django formset 中的所有表单都需要?我试图验证 cleaned_data 覆盖 formset 的 clean() 方法中所有字段的存在,但它只是默默地失败,没有显示任何错误。

谢谢!

源代码:

class BaseScheduleForm(forms.ModelForm):

    def __init__(self, *args, **kwargs):
        super(BaseScheduleForm, self).__init__(*args, **kwargs)
        self.fields['day'].widget = forms.HiddenInput()
        self.fields['user'].widget = forms.HiddenInput()

    class Meta:
        model = Schedule

    def clean_end_time(self):
        start_time = self.cleaned_data.get('start_time')
        end_time = self.cleaned_data['end_time']

        if start_time and end_time:
            if end_time <= start_time:
                raise forms.ValidationError("End time must be later that start time.")
        return end_time

class BaseScheduleFormset(forms.models.BaseModelFormSet):

    def __init__(self, *args, **kwargs):
        super(BaseScheduleFormset, self).__init__(*args, **kwargs)
        for number, weekday in enumerate(WEEKDAYS):
            self.forms[number].day_name = weekday[1]

    def clean(self):
        raise forms.ValidationError('You must specify schedule for the whole week')

ScheduleFormset = forms.models.modelformset_factory(Schedule, extra=7, max_num=7,
    form=BaseScheduleForm, formset=BaseScheduleFormset)

每天有 7 张表格,必须全部填写才有效。在上面的示例中,我只是尝试在 clean 中引发错误。 is_valid() 变为 False,但未显示错误。

【问题讨论】:

能否提供更多细节和源代码? 【参考方案1】:

有点难以理解哪里没有显示错误。

如果 is_valid 为 False,那么很好,它自己的验证正在工作。然后下一个要寻找的地方是模板层。你如何检查错误? form.errors 或 somefield.errors。

clean 方法在这里设置的方式,它们的错误不会与任何字段相关联,但应该进入 all 错误槽。

干杯

【讨论】:

formset.errors 为空,但 formset.is_valid() 为假。对我来说似乎是一个错误。【参考方案2】:

我遇到了同样的问题,并通过检查源找出了这些错误的存储位置。当您覆盖 formset 的 clean 方法并引发验证错误时,错误将存储在 non_form_errors 属性中。

因此,假设 formset 的模板变量名为“formset”,您需要在模板中添加以下内容:

 formset.non_form_errors 

【讨论】:

以上是关于需要 Django 表单集的主要内容,如果未能解决你的问题,请参考以下文章

Django - CreateView 不使用嵌套表单集保存表单

将实例传递给 Django 表单集

django 内联表单集的单选按钮

Django:如何在 ajax 中返回模型表单集并在模板中使用

没有实例的 Django Formset

Django ModelAdmin 从 ModelForm 获取查询集