在Django Forms中的日期字段上清理方法

时间:2014-05-27 23:15:03

标签: python django datetime

我需要覆盖我的Django表单的clean()方法来测试两个日期字段:begin_date和end_date(是开始日期之后的结束日期,是现在的开始日期)。< / p>

问题是,当这两个字段中的一个为空或无效时,我得到一个异常(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 个答案:

答案 0 :(得分:3)

在Django中,当您调用super(MyForm, self).clean()超类时,如果数据已经有效,则仅填充cleaning_data,这就是文档中使用get方法(https://docs.djangoproject.com/en/dev/ref/forms/validation/#cleaning-and-validating-fields-that-depend-on-each-other)的原因。

由于您不想将datetime对象一起比较,请使用此代码确保日期字段正确无误:

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"))

答案 1 :(得分: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")

在尝试使用它们之前检查是否存在这两个值,如果缺少一个或两个值,则返回一个合适的错误消息。