Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django表单中日期字段的Clean方法_Python_Django_Datetime - Fatal编程技术网

Python Django表单中日期字段的Clean方法

Python Django表单中日期字段的Clean方法,python,django,datetime,Python,Django,Datetime,我需要重写Django表单的clean()方法来同时测试两个日期字段:开始日期和结束日期(结束日期晚于开始日期,开始日期晚于现在) 问题是,当这两个字段中的一个为空或无效时,我得到了一个异常(KeyError)。我想得到一个简单的错误表单,就像我得到的空字符域一样 我很肯定能在这里找到答案:但我没有 代码如下: class MyForm(forms.Form): begin_date = forms.DateField() end_date = forms.DateField()

我需要重写Django表单的
clean()
方法来同时测试两个日期字段:开始日期和结束日期(结束日期晚于开始日期,开始日期晚于现在)

问题是,当这两个字段中的一个为空或无效时,我得到了一个异常(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
类MyForm(forms.Form):
begin\u date=forms.DateField()
end_date=forms.DateField()
#...
def清洁(自清洁):
cleaned_data=super(MyForm,self).clean()
错误=[]
开始日期=已清理的数据[“开始日期”]
结束日期=已清理的数据[“结束日期”]
#...
#测试1
如果开始日期<日期.今天():
错误。追加(forms.ValidationError)(
“约会,但在约会后做什么?”)
#测试2
如果结束日期<开始日期:
错误。追加(forms.ValidationError)(
“日期是指日期,但不包括日期”))
如果出现错误:
引发表单。验证错误(错误)
返回已清除的数据
怎么样

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

这将在尝试使用这两个值之前检查它们是否存在,如果其中一个或两个值都丢失,将返回一条适当的错误消息。

在Django中,当您调用
super(MyForm,self).clean()
时,超类仅在数据已经有效的情况下才会填充清理后的数据,这就是为什么在文档中使用
get
方法的原因()

由于不希望同时比较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"))

你的
cleaned\u data=super(DealForm,self).clean()可以吗?因为类的名称是
MyForm
not
DealForm
是的,对不起,我在中更改了代码以使其简单(编辑可以)。我在另一篇文章中也看到了这一点。但问题是
cleaned\u data.get('begin\u date')
返回一个字符串(不是日期),然后我无法执行类似于
begin\u date
的操作。在这种情况下,您可以尝试先询问键是否存在
cleaned\u data.keys()中的'begin\u date':
使用
cleaned\u data['begin\u date']
的尝试将字符串转换为datetime,但我确信清理后的数据返回datetime对象谢谢,这正是我需要的。让我编辑您的答案以添加代码,我会将其标记为已接受。再次感谢。谢谢。但是,这不会处理无效数据,如
2014/13/56