django中表单的清洁方法中的密钥在清理数据中不可用

时间:2016-12-31 09:50:55

标签: python django

我有以下ModelForm类。

from django.forms import ModelForm
from tenant.models import EventsModel
from django.utils.translation import ugettext_lazy as _
from django.utils import timezone
from django import forms

class EventsForm(ModelForm):
    class Meta:
        model = EventsModel
        fields = '__all__'

    def clean_start_date_time(self):
        # can not be before than now.
        data = self.cleaned_data
        print(data)
        start_date_time =  data.get("start_date_time")
        now_date_time = timezone.now()
        if start_date_time < now_date_time:
            raise forms.ValidationError(
                _('Start time has passed.'),
                code='invalid',
            )
        return data

    def clean(self):
        # end date can not be before or equal to start date time
        # data = super(EventsForm, self).clean()
        data = self.cleaned_data
        print(data)
        start_date_time =  data.get("start_date_time")
        end_date_time = data.get("end_date_time")
        if start_date_time >= end_date_time:
            raise forms.ValidationError(
                _('End time should be after start time.'),
                code='invalid',
            )

clean_start_date_time引发了错误,因为start_date_time已经过去了。 start_date_time方法中提供了clean_start_date_time,但clean方法无法使用clean_start_date_time方法。 为什么会这样?

我在两种方法中都打印了清理过的数据,清理后的数据存在差异。 为什么会有这种差异?

清除{'tenant_sys_id': None, 'name': 'dfghj', 'start_date_time': datetime.datetime(2016, 12, 21, 13, 20, 23)} 中的数据:

clean

清除{'created_by': None, 'last_updated_when': None, 'last_updated_by': None, 'tenant_sys_id': None, 'notes': 'g', 'name': 'dfghj', 'created_when': None, 'end_date_time': datetime.datetime(2016, 12, 31, 14, 20, 29)} 中的数据:

.htaccess

2 个答案:

答案 0 :(得分:2)

它没有,因为您在clean_start_date_time中引发了错误,而不是返回。请注意,您完全按照自己的意愿行事。你永远不应该假设clean中有一个字段;如果用户没有填写该字段的数据,则会发生同样的事情。在做其他任何事情之前检查值是否存在。

答案 1 :(得分:1)

根据documentation,您的函数clean_start_date_time应返回已清理的字段值 start_date_time

您的功能现在退出异常或 cleaning_data 。这就是 clean_data clean 方法和 clean_start_date_time 方法中不相同的原因:

  

在表单子类上调用clean_fieldname()方法    - 其中fieldname替换为表单字段属性的名称。

     

...

     

此方法应返回从cleaning_data获取的已清理值,   无论是否有任何改变。