在清洁的数据中没有可用的清洁数据在django中形式的清洁方法
问题描述:
我有下面的ModelForm类。在清洁的数据中没有可用的清洁数据在django中形式的清洁方法
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
清洗数据显示:clean
{'tenant_sys_id': None, 'name': 'dfghj', 'start_date_time': datetime.datetime(2016, 12, 21, 13, 20, 23)}
清理数据:
{'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)}
答
它不存在,因为你在clean_start_date_time
而不是返回引发错误。请注意,你确实做了你应该做的事情。你永远不应该假设一个字段将出现在clean
;如果用户没有填写该字段的数据,也会发生同样的情况。在做任何事之前检查值是否存在。
答
根据documentation,您的函数clean_start_date_time应返回已清除的字段值start_date_time。
您的功能现在退出或者有例外,或者已清空数据。即其原因在于cleaned_data不在清洁方法相同,并且clean_start_date_time方法:
的clean_fieldname()方法被调用上的形式的子类 - ,其中字段名替换为表单字段属性的名称。
...
这个方法应该返回 从cleaned_data获得的清洁值,不管它是否改变任何东西,或不。
start_date_time存在于POST数据中。它也存在于clean_start_date_time中。但不是只存在于清洁方法中。 – User42
是的,因为我给了。这是*期望的行为*。 –
明白了。如果clean_start_date_time引发错误,那么start_date_time将不会在清理后的数据中出现。在这种特殊情况下,直到用户纠正第一个错误时才会显示第二个错误。有没有什么方法可以向用户显示这两种错误,假设数据以一种应该引发机器人错误的方式输入。 – User42