python - Django Forms 中日期字段的清理方法

标签 python django datetime

我需要覆盖 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

最佳答案

在 Django 中,当您调用 super(MyForm, self).clean() 时,父类(super class)仅在数据已经有效时才填充 cleaned_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"))

关于python - Django Forms 中日期字段的清理方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23900432/

相关文章:

python - 使用 python 向 aspx 页面提交查询并抓取结果?

python - 将图像数据字符串 (str) 转换回字节

ios - 获取Apple Clock应用程序中使用的城市/时区列表

python - 如何修复 Django-allauth settings.py contrib 语法错误?

python - 在 Django (Admin) 中按其他属性过滤属性对象

php - 如何使用 Doctrine2 将 MySQL 列 "timestamp"映射到一个字段

JavaScript 日期格式转换

Python 数学运算顺序

python - 配置测试和覆盖率以在设置时运行

python - 使用 Django admin 的自定义列