2014-11-08 49 views
1

我有以下的Django模型。我的表单用于在时间表上输入时间,并且有start_time和end_time字段。我想添加一个自定义检查以确保start_time在end_time之前或小于end_time,否则如果不提供某些反馈给用户。我试图创建一个自定义的干净方法来做到这一点,但我做错了什么。如何将自定义验证添加到Django modelForm中?

(片断从models.py)

class TimesheetEntry(Model): 
    WORKED='worked' 
    SICK='sick' 
    VACATION='vacation' 
    TIME_CHOICES=(
     (WORKED,'Worked'), 
     (SICK,'Sick'), 
     (VACATION,'Vacation')) 

    timesheet = models.ForeignKey('Timesheet', related_name='entries') 
    start_time = models.DateTimeField(default=datetime.datetime.now) 
    end_time = models.DateTimeField(blank=True, null=True) 

(片断从forms.py)

class TimesheetEntryForm(forms.ModelForm): 
    start_time = forms.DateTimeField(widget=forms.SplitDateTimeWidget()) 
    end_time = forms.DateTimeField(widget=forms.SplitDateTimeWidget()) 
    class Meta: 
     model = TimesheetEntry 
     exclude = ['timesheet'] 

    def clean(self, *args, **kwargs): 
     super(TimesheetEntryForm, self).clean(*args, **kwargs) 
     if self.fields['start_time'] >= self.fields['end_time']: 
      raise ValidationError("Start Time should be less than End Time") 

当我提交表单(该START_TIME是否大于END_TIME小于或更大,我奇怪地得到了两个错误中的一个,没有明显的理由,为什么它每次都不给我同一个错误,它不更新数据库,我可以反复尝试使用相同的数据反复提交相同的数据,我是以下两种错误之一,其概率大概为50%哪一个。我知道这是一个很大的难题,但我希望有人能够发现我正在做的一个明显的错误,并帮助我弄清楚如何纠正这个问题。

TypeError: argument of type 'NoneType' is not iterable 

- 或 -

NameError: global name 'ValidationError' is not defined 

,应当注意的是,通过该方法去除干净()方法将停止错误,并让我输入新的条目(包括那些导致负小时的总-其是端问题我试图解决)

+0

您是否导入了课程? '从django.core.exceptions import ValidationError' – karthikr 2014-11-08 22:03:51

回答

0

关于NameError,只需:

from django.core.exceptions import ValidationError 

还要说明一点,而不是重写表单域,请执行下列操作形式的元内:

widgets = { 
      'start_time': SplitDateTimeWidget(), 
      'end_time': SplitDateTimeWidget(), 
      } 

最后,清洁的方法应该是这个样子:

def clean(self): 
    cleaned_data = super(TimesheetEntryForm, self).clean() 
    if cleaned_data.get('start_time') >= cleaned_data.get('end_time'): 
     raise ValidationError("blah blah") 

希望它能帮助!

0

两个错误:首先,您应该访问self.cleaned_data['start_time'](和end_time);其次,你需要参考forms.ValidationError

此外,它不会伤害做到这一点,但没有实际需要调用超级清洁方法。

+0

感谢Daniel,解决了验证错误。但是现在我只是得到类型错误。它似乎只是调用干净的方法,即使我把所有其他东西都拿出来,只是放入“通过”它仍然给我像以前一样的TypeError。 – 2014-11-09 01:18:59

+0

如果它提供任何线索,这里有一点追溯: 文件“/home/josh/.virtualenvs/fizbug/lib/python2.7/site-packages/django/forms/forms.py”,行275,在full_clean self._post_clean() 文件“/home/josh/.virtualenvs/fizbug/lib/python2.7/site-packages/django/forms/models.py”,第396行,在_post_clean中 self.instance = construct_instance() self,self.instance,opts.fields,opts.exclude) 文件“/home/josh/.virtualenvs/fizbug/lib/python2.7/site-packages/django/forms/models。py“,第46行,在construct_instance中 或不是f.name中已清理的数据中: TypeError:类型为'NoneType'的参数不可迭代 – 2014-11-09 01:22:38

+0

如果您不在Django 1.6上,则需要返回deleted_data字典 – 2014-11-09 09:00:09

相关问题