【问题标题】:django - Form ValidationError not workingdjango - 表单验证错误不起作用
【发布时间】:2018-01-23 07:37:57
【问题描述】:

我正在尝试在哪里引发验证错误:

1) 如果在start_date 字段中选择的日期是前一天,那么它将引发错误。当我提交它时抛出这个错误

“NoneType”和“datetime.date”的实例之间不支持“

2) 如果结束日期早于开始日期,则会引发另一个错误。对于这部分,它的部分工作是我不保存提交的表单但它不会引发和验证错误

我知道这不是第一次有人问这个问题,但我按照其他人给出的答案,它不起作用,我哪里做错了?

非常感谢任何帮助。

下面是我的代码:

模型.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)

【问题讨论】:

    标签: python django django-forms validationerror


    【解决方案1】:

    看起来你只是把函数命名错了。将clean_date 更改为clean_start_date,因为它的格式应为clean_function_name

    希望对你有帮助!

    【讨论】:

    • 嗨@Jahongir 我将def clean_date(self): 切换到def clean_start_date(self): 但不幸的是它仍然无法正常工作。
    【解决方案2】:

    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
    

    【讨论】:

    • 您好,感谢您回复@Alasdair,我已将条件更改为if start_date &lt; datetime.date.today():,我很困惑为什么它不会,因为如果日期有效,它会保存并正确自动计算持续时间
    • clean 方法运行之前单独清理这些字段。如果某个字段无效,则clean方法运行时该字段不在cleaned_data中,因此需要检查get()是否返回None
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-27
    • 1970-01-01
    • 2016-03-20
    • 2011-02-21
    • 1970-01-01
    相关资源
    最近更新 更多