2016-12-31 144 views
1

我有下面的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)} 

回答

2

它不存在,因为你在clean_start_date_time而不是返回引发错误。请注意,你确实做了你应该做的事情。你永远不应该假设一个字段将出现在clean;如果用户没有填写该字段的数据,也会发生同样的情况。在做任何事之前检查值是否存在。

+0

start_date_time存在于POST数据中。它也存在于clean_start_date_time中。但不是只存在于清洁方法中。 – User42

+0

是的,因为我给了。这是*期望的行为*。 –

+0

明白了。如果clean_start_date_time引发错误,那么start_date_time将不会在清理后的数据中出现。在这种特殊情况下,直到用户纠正第一个错误时才会显示第二个错误。有没有什么方法可以向用户显示这两种错误,假设数据以一种应该引发机器人错误的方式输入。 – User42

1

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

您的功能现在退出或者有例外,或者已清空数据。即其原因在于cleaned_data不在清洁方法相同,并且clean_start_date_time方法:

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

...

这个方法应该返回 从cleaned_data获得的清洁值,不管它是否改变任何东西,或不。