Django: Валидатор возвращает False, но form.is_valid() == True

Я создал собственный валидатор, который проверяет, меньше ли верхнее число в RangeField некоторого числа.

Проблема в том, что я вижу в режиме отладки, что Validator.compare возвращает False, но Django вызывает DataError

Значение "21474834555" выходит за пределы допустимого диапазона для целочисленного типа LINE 1: ...NULL, "cena" = NULL, "poznamka" = '', "rozloha" = '[ -214748...

Я не могу понять, почему он вызывает эту ошибку, когда он должен поднять ValidationError до этого.

Я знаю, что это число вне допустимого диапазона, поэтому я создал файл Validator.

ПОСМОТРЕТЬ

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

введите здесь описание изображения


person Milano    schedule 09.07.2018    source источник
comment
a.upper наверное должно быть a.upper()?   -  person Willem Van Onsem    schedule 09.07.2018
comment
@WillemVanOnsem Нет, не должно, я проверил. Более того, я уверен, что валидатор возвращает False, проверьте нижнюю часть вопроса, я добавил скриншот отладки Pycharm.   -  person Milano    schedule 09.07.2018
comment
Ааа... a и b это не строки, это диапазоны?   -  person Willem Van Onsem    schedule 09.07.2018
comment
Да, проверьте модель: rozloha = IntegerRangeField(null=True, Blank=True, verbose_name='Розлоха [м2]', validators=[RangeCompleteMinValueValidator(-2147483648), RangeCompleteMaxValueValidator(2147483647)])   -  person Milano    schedule 09.07.2018


Ответы (1)


Валидатор форм не может видеть валидаторы моделей, вы должны использовать clean, если хотите избежать доступа к слою модели

Вы выполняете валидацию в своем экземпляре моделей, поэтому, когда вы собираетесь сохранить... в то время как form.is_valid запускается в форме, поэтому эти проверки не достигают ваших моделей... для проверки вашей логики в вашей форме вы должны использовать чистую

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."
                )

https://docs.djangoproject.com/en/2.0/ref/forms/validation/

person Diego Vinícius    schedule 09.07.2018