2014-11-08 48 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

相關問題