在Django模型中覆盖clean方法会破坏其他验证吗?

gaa*_*kam 1 django validation django-models django-admin

假设我有一个简单的模型,models.py可以通过Django Admin编辑:

class Range(models.Model):
    gt = models.IntegerField('Greater than')
    lt = models.IntegerField('Lesser than')

    def clean(self):
        if self.gt >= self.lt:
            raise ValidationError('Incorrect range')
Run Code Online (Sandbox Code Playgroud)

问题:尽管以上代码在确保gt小于的假设方面做得很好lt,但是它也破坏了Django提供的其他基本验证。例如,如果我在Django admin中为这些字段输入了一些非数字数据,则会看到跨越多个屏幕的调试消息:

在此处输入图片说明

如果我clean(self)从的定义中删除了覆盖的方法Range,则此基本验证将再次开始正常工作:

在此处输入图片说明

但当然,现在我可以进入Range以s gt大于lt

我真的不知道我在做什么错,因为我只是按照https://docs.djangoproject.com/zh-CN/1.9/ref/models/instances/#validating-objects遵循Django文档

我的错误在哪里?如何正确地为我的表格提供验证?

ahm*_*med 6

您可以先运行父clean方法:

class Range(models.Model):
    gt = models.IntegerField('Greater than')
    lt = models.IntegerField('Lesser than')

    def clean(self):
        super(Range, self).clean()

        if self.gt >= self.lt:
            raise ValidationError('Incorrect range')
Run Code Online (Sandbox Code Playgroud)