2014-11-08 4 views
1

У меня есть модель модели Django. Моя форма предназначена для ввода времени в расписании, и есть поля start_time и end_time. Я хочу добавить пользовательскую проверку, чтобы удостовериться, что start_time предшествует или меньше, чем end_time, или, если вы не предоставите некоторую обратную связь пользователю, если это не так. Я пытаюсь создать собственный чистый метод для этого, но я делаю что-то неправильно.Как добавить пользовательскую проверку в модель Django?

(фрагмент из 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, я странно получаю одну из двух ошибок, без видимых причин, почему она не дает мне одну и ту же единицу каждый раз. Она не обновляет db, и я могу неоднократно пытаться отправить одну и ту же форму с теми же данными снова и снова и даст я имею одну из следующих двух ошибок с примерно 50% -ой вероятностью: к которому. Я знаю, что это маленький кусочек большой головоломки, но я надеюсь, что кто-то сможет заметить явную ошибку, которую я делаю, и помочь мне разобраться, как исправить это.

TypeError: argument of type 'NoneType' is not iterable 

-ИЛИ-

NameError: global name 'ValidationError' is not defined 

следует отметить, что при удалении методы очистки() от метода остановят ошибки и позвольте мне вводить новые записи (в том числе в результате отрицательный часы полные, которая является конечной проблемой, я пытаюсь решить)

+0

Вы импортировали класс? 'from django.core.exceptions import ValidationError' – karthikr

ответ

0

что касается NameError, просто:

from django.core.exceptions import ValidationError 

Еще одно замечания, вместо того, чтобы переписать поля формы, выполните следующее действия в Meta формы в:

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

Спасибо, Дэниэл, который решил ошибку проверки, спасибо за это. Однако теперь я просто получаю ошибку типа. Кажется, это просто вызов чистого метода, даже если я вывожу все остальное и просто поставлю «проход», он все равно дает мне тот же TypeError, что и раньше. –

+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, in construct_instance или нет f.name в cleaned_data: ТипError: аргумент типа« NoneType »не является итерабельным –

+0

Если вы не используете Django 1.6, вам нужно вернуть файл cleaned_data dict. –

Смежные вопросы