django - ошибка проверки формы не работает

Я пытаюсь вызвать ошибку проверки, где:

1) если дата, выбранная в поле start_date, является позавчерашней, тогда она выдаст ошибку. когда я отправляю его, выдает эту ошибку

«‹» не поддерживается между экземплярами «NoneType» и «datetime.date».

2) если дата окончания является датой до даты начала, это вызовет другую ошибку. Для этой части это частично работает, когда я не сохраняю отправленную форму, но она не вызывает ошибку проверки.

Я знаю, что это не первый раз, когда кто-то задает этот вопрос, но я последовал ответу, данному другими, и он не работает, где я ошибаюсь?

Любая помощь очень ценится.

Ниже мой код:

модель.ру:

class Leave(models.Model):
    employee = models.ForeignKey(Employee, on_delete=models.CASCADE, related_name='+')
    start_date = models.DateField()
    end_date = models.DateField()
    duration = models.FloatField()

форма.ру:

class LeavesDetailForm(forms.ModelForm):

    class Meta:
        model = Leave
        fields = ('employee', 'type', 'status', 'start_date', 'end_date', 'duration', 'comment')
        widgets = {'start_date': forms.DateInput(attrs={'type': 'date'}),
                   'end_date': forms.DateInput(attrs={'type': 'date'}),
                   'employee': forms.HiddenInput(),
                   'duration': forms.HiddenInput(),
                   'status': forms.HiddenInput()}

    def clean(self):
        start_date = self.cleaned_data.get("start_date")
        end_date = self.cleaned_data.get("end_date")
        if end_date < start_date:
        msg = u"End date should be greater than start date."
        self._errors["end_date"] = self.error_class([msg])
        raise forms.ValidationError("End date should be greater than start date.!")

    def clean_start_date(self):
        start_date = self.cleaned_data.get('start_date')
        if self.instance.start_date < datetime.date.today():
            raise forms.ValidationError("The date cannot be in the past!")
        return start_date

вид.py :

def my_leaves_view(request):
    form = LeavesDetailForm(request.POST or None)
    leaves_log = Leave.objects.all().filter(employee=request.user.profile.employee.id)
        if form.is_valid():
        inst = form.save(commit=False)
        inst.start_date = form.cleaned_data['start_date']
        inst.end_date = form.cleaned_data['end_date']
        duration = (inst.end_date - inst.start_date).days
        inst.duration = duration
        inst.save()
        return HttpResponseRedirect('my_leaves_content.html')
    context = {'form': form}
    return render(request, 'hrm/my_leaves/my_leaves_content.html', context)

person M.Izzat    schedule 15.08.2017    source источник


Ответы (2)


Похоже, вы только что назвали функцию неправильно. Измените clean_date на clean_start_date, как это должно быть в формате clean_function_name.

Надеюсь, поможет!

person Jahongir Rahmonov    schedule 15.08.2017
comment
Привет, @Jahongir, я переключаю def clean_date(self): на def clean_start_date(self):, но, к сожалению, это все еще не работает. - person M.Izzat; 15.08.2017

В методе clean start_date или end_date могут быть None, если пользователь не представил правильную дату.

Как следует из ошибки, Python не позволит вам сравнить экземпляр date с экземпляром None.

Вы должны убедиться, что вы получили действительные даты от cleaned_data, прежде чем сравнивать их:

if end_date is not None and start_date is not None and end_date < start_date:

В методе clean_start_date вы должны использовать start_date, который вы получили из cleaned_data, а не self.instance.start_date:

def clean_start_date(self):
    start_date = self.cleaned_data.get('start_date')
    if start_date < datetime.date.today():
        raise forms.ValidationError("The date cannot be in the past!")
    return start_date
person Alasdair    schedule 15.08.2017
comment
Привет, спасибо за ответ @Alasdair, я изменил свое состояние на if start_date < datetime.date.today():, я не понимаю, почему это не так, потому что, если дата действительна, она сохраняется и автоматически рассчитывает продолжительность - person M.Izzat; 16.08.2017
comment
Поля очищаются по отдельности перед запуском метода clean. Если поле недействительно, его не будет в cleaned_data при запуске метода clean, поэтому вам нужно проверить, вернул ли get() None. - person Alasdair; 16.08.2017