使用Django的ModelForm时出现ValidationError

16 投票
1 回答
45969 浏览
提问于 2025-04-17 08:37

我刚接触Django,正在做一个小项目,里面用到了ModelForm。对于日期字段,我想进行自定义验证,也就是说,如果用户输入的日期早于今天的日期,就应该在日期字段旁边显示一个错误信息。我按照Django的文档写了代码,但在模型表单中,raise语句给我带来了ValidationErrors,像下面这样:

ValidationError at /add_task/
[u"Please enter valid date. Either today's date or after that."]

请帮我解决这个问题。提前谢谢你。

models.py

from django.db import models

class MyTask(models.Model):
    summary=models.CharField(max_length=100)
    description=models.CharField(max_length=500)
    due_date=models.DateField(null=True)
    completed_status=models.BooleanField()
    
    def __unicode__(self):
        return self.summary

forms.py

from django.forms import ModelForm, Textarea
from django.forms.extras.widgets import SelectDateWidget
from django.core.exceptions import ValidationError
from assignment.models import MyTask

import datetime

class AddTaskForm(ModelForm):

    class Meta:
        model=MyTask
        fields=('summary','description','due_date')
        widgets = {
            'description': Textarea(attrs={'cols': 50, 'rows': 10}),
            'due_date':SelectDateWidget(),
        }
        
    def get_due_date(self):
        diff=self.cleaned_data['due_date']-datetime.date.today()
        if diff.days<0:
            raise ValidationError("Please enter valid date. Either today's date or after that.")
        else:
            return self.cleaned_data['due_date']    
    
    def get_summary(self):
            return self.cleaned_data['summary']


    def get_description(self):
            return self.cleaned_data['description']

1 个回答

24

你的验证方法需要叫做 clean_due_date。在 Django 3 之前,它应该抛出 forms.ValidationError,但在 Django 3 中,它应该使用 core.exceptions.ValidationError

我不知道 get_summaryget_description 这两个方法是干什么用的,它们没有被调用,也没有做任何有用的事情。

你可以在这里查看 Django 3 的文档 这里,以及 Django 2 的文档 这里

撰写回答