簡體   English   中英

django-表單ValidationError不起作用

[英]django - Form ValidationError not working

我正在嘗試引發Validation錯誤,其中:

1)如果在start_date字段中選擇的日期是今天的前一天,則它將引發錯誤。 當我提交它時拋出此錯誤

“ NoneType”和“ datetime.date”的實例之間不支持“ <”

2)如果結束日期是開始日期之前的日期,則會引發另一個錯誤。 對於這一部分,我不保存提交的表單但不引發驗證錯誤,部分工作

我知道這不是第一次有人問這個問題,但是我遵循了別人給出的答案,但它不起作用,我在哪里做錯了?

任何幫助都非常感謝。

下面是我的代碼:

model.py:

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()

form.py:

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

view.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)

看起來您剛剛將函數命名為錯誤。 clean_date更改為clean_start_date ,其格式應為clean_function_name

希望能幫助到你!

clean方法中,如果用戶未提交有效日期,則start_dateend_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方法中,應該使用從cleaned_data獲取的start_date ,而不要使用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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM