Django 表单集必填

4 投票
2 回答
1328 浏览
提问于 2025-04-15 15:27

如何让Django中的所有表单都变成必填项?我尝试通过重写表单集的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,但没有显示任何错误信息。

2 个回答

0

我之前也遇到过这个问题,后来通过查看源代码找到了这些错误存储的位置。当你重写一个表单集的清理方法并抛出验证错误时,这些错误会被存储在 non_form_errors 属性里。

所以在你的模板中,你需要添加以下内容,假设你的表单集变量叫做 'formset':

{{ formset.non_form_errors }}
0

有点难理解错误在哪里没有显示出来。

如果is_valid是False,那就很好,说明验证本身是有效的。接下来要查看的就是模板层。你是怎么检查错误的?是用{{form.errors}}还是{{somefield.errors}}。

这里的clean方法设置方式是,它们的错误不会和任何字段关联,而是应该放在所有错误的地方。

谢谢!

撰写回答