我有以下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
答案 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获取的已清理值, 无论是否有任何改变。