【问题标题】:Overriding the clean method in a Django model breaks other validations?覆盖 Django 模型中的 clean 方法会破坏其他验证?
【发布时间】:2016-08-05 07:42:36
【问题描述】:

假设我在 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')

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

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

当然,现在我可以输入Ranges,其中gt 大于lt

我真的不知道我做错了什么,因为我虽然只是按照 https://docs.djangoproject.com/en/1.9/ref/models/instances/#validating-objects 遵循 Django 文档进行操作

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

【问题讨论】:

    标签: django validation django-models django-admin


    【解决方案1】:

    你可以先运行父clean方法:

    class Range(models.Model):
        gt = models.IntegerField('Greater than')
        lt = models.IntegerField('Lesser than')
        
        def clean(self):
            super().clean()
        
            if self.gt >= self.lt:
                raise ValidationError('Incorrect range')
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-02-18
      • 2012-02-21
      • 1970-01-01
      • 1970-01-01
      • 2020-06-14
      • 1970-01-01
      • 1970-01-01
      • 2011-05-10
      相关资源
      最近更新 更多