Django表单日期字段的清理方法

4 投票
2 回答
3899 浏览
提问于 2025-04-18 07:45

我需要重写我Django表单中的clean()方法,以便同时检查两个日期字段:一个是开始日期(begin_date),另一个是结束日期(end_date)。我想确认结束日期是否晚于开始日期,以及开始日期是否晚于现在。

问题是,当这两个字段中有一个为空或者无效时,我会遇到一个异常(KeyError)。我希望能得到一个简单的错误提示,就像处理空的字符字段时那样。

我本以为可以在这里找到答案:Django self.cleaned_data Keyerror,但没有找到。

以下是代码:

class MyForm(forms.Form):
    begin_date = forms.DateField()
    end_date = forms.DateField()
    #...

    def clean(self):

        cleaned_data = super(MyForm, self).clean()
        errors = []

        begin_date = cleaned_data['begin_date']
        end_date = cleaned_data['end_date']
        #...

        # Test 1
            if begin_date < date.today():
                errors.append(forms.ValidationError(
                "La date de début doit être postérieure à la date actuelle"))
        # Test 2
            if end_date < begin_date:
                errors.append(forms.ValidationError(
                "La date de fin doit être posétieure à la date de début"))

        if errors:
            raise forms.ValidationError(errors)

        return cleaned_data

2 个回答

2

这样做怎么样

if all([d in cleaned_data for d in ['begin_date', 'end_date']]):
    # your code
else:
    raise forms.ValidationError("A start date and end date are required")

这个代码会在使用这两个值之前,先检查它们是否都存在。如果其中一个或两个值缺失,就会返回一个合适的错误信息。

3

在Django中,当你调用 super(MyForm, self).clean() 时,父类只会在数据有效的情况下填充清理后的数据。这就是为什么文档中使用 get 方法的原因(https://docs.djangoproject.com/en/dev/ref/forms/validation/#cleaning-and-validating-fields-that-depend-on-each-other)。

如果你想比较日期时间对象,可以使用下面的代码来确保日期字段是正确的:

if 'begin_date' in cleaned_data.keys():
        begin_date = cleaned_data['begin_date']
    else:
        begin_date = None
        errors.append(forms.ValidationError(
            "Bad start date format or empty"))

撰写回答