Django:验证程序返回False,但form.is\u valid()==True

Django:验证程序返回False,但form.is\u valid()==True,django,python-3.x,django-models,django-forms,django-2.0,Django,Python 3.x,Django Models,Django Forms,Django 2.0,我创建了一个自定义验证器,用于检查范围字段中的上限数字是否低于某个数字 问题是,我可以看到在调试模式下,Validator.compare返回False但Django引发DataError 值“21474834555”超出类型整数行1的范围:…NULL, “cena”=NULL,“poznamka”=”,“rozloha”=”[-214748 我不明白它为什么会在应该在此之前引发ValidationError时引发此错误 我知道数字超出范围,这就是我创建验证程序的原因 查看 class Dopy

我创建了一个自定义验证器,用于检查
范围字段中的上限数字是否低于某个数字

问题是,我可以看到在调试模式下,
Validator.compare
返回
False
Django
引发
DataError

值“21474834555”超出类型整数行1的范围:…NULL, “cena”=NULL,“poznamka”=”,“rozloha”=”[-214748

我不明白它为什么会在应该在此之前引发
ValidationError
时引发此错误

我知道数字超出范围,这就是我创建
验证程序的原因

查看

class DopytUpdateView(LoginRequiredMaklerAccessMixin, UpdateView):
    model = Dopyt
    form_class = DopytForm
    template_name = 'dopyty/dopyt.html'
表格

class DopytForm(forms.ModelForm):

    class Meta:
        model = Dopyt
        fields = [...'rozloha',...]
验证程序

class RangeCompleteMaxValueValidator(MaxValueValidator):
    def compare(self, a, b):
        upper_ok = (a.upper > b) if a.upper else True
        lower_ok = (a.lower > b) if a.lower else True
        return upper_ok and lower_ok
型号

class Dopyt(TimeStampedModel):
    ...
    rozloha = IntegerRangeField(null=True, blank=True, verbose_name='Rozloha [m2]',
                                validators=[RangeCompleteMinValueValidator(-2147483648),
                                            RangeCompleteMaxValueValidator(2147483647)])
你知道它为什么会这样吗

编辑

如您所见,验证器返回
False


表单验证程序看不到模型验证程序,如果要避免到达模型层,必须使用clean

validador在您的模型实例上运行,因此当您要保存时…while form.u在表单中运行有效吗?因此此验证不会到达您的模型…要在表单上验证您的逻辑,您应该使用clean

from django import forms

class ContactForm(forms.Form):
    # Everything as before.
    ...

    def clean(self):
        cleaned_data = super().clean()
        cc_myself = cleaned_data.get("cc_myself")
        subject = cleaned_data.get("subject")

        if cc_myself and subject:
            # Only do something if both fields are valid so far.
            if "help" not in subject:
                raise forms.ValidationError(
                    "Did not send for 'help' in the subject despite "
                    "CC'ing yourself."
                )

a.upper
可能应该是
a.upper()
?@WillemVanOnsem不,不应该,我已经检查过了。此外,我确信验证器返回False,检查问题的底部,我添加了一个Pycharm调试屏幕截图。啊…
a
b
不是字符串,这些是范围?是的,检查模型:rozloha=integragerangefield(null=True,blank=True,verbose\u name='rozloha[m2]',验证器=[RangeCompleteMaxValueValidator(-2147483648),RangeCompleteMaxValueValidator(2147483647)])