Джанго: Как проверить / валидатор "больше, чем" между двумя полями FormFields? - PullRequest
0 голосов
/ 23 сентября 2019

Я тестирую написание валидатора в Django.Пока это сработало, но сейчас я хотел бы написать что-то вроде «диапазона».

forms.py

class AnimalForm(forms.ModelForm):
    weight = forms.DecimalField(validators=[validate_gtr])

    class Meta:
        model = Animal
        fields = [
            'name',
            'weight',
            'daily_food_min',
            'daily_food_max',          
            'species',
            'farmer',    
        ]

    def __init__(self, *args, **kwargs):
        super(AnimalForm, self).__init__(*args, **kwargs)
        self.fields['name'].help_text = 'Name of Animal'
        self.fields['weight'].help_text = 'Weight in Kg'
        self.fields['species'].help_text = 'choose a species'

validator.py

from django.core.exceptions import ValidationError
from django.utils.translation import gettext_lazy as _



def validate_gtr(value):
    if value > 100:
        raise ValidationError(
            _('(value) Kg. Animal is too heavy'),
            params={'value': value},
        )

Вопрос

Как видите, я уже написал простое подтверждение validate_gtr, чтобы проверить вес моих животных - это сработало.Теперь я хотел бы проверить daily_food_min и daily_food_max друг против друга, что означает, что daily_food_max должно быть больше daily_food_min, при сохранении или при вводе чисел в моей HTML-форме.

thisбыл мой подход

forms.py

class AnimalForm(forms.ModelForm):
    weight = forms.DecimalField(validators=[validate_gtr])
    daily_food_min = forms.IntegerField(min_value=0, validators=[validate_food])
    daily_food_max = forms.IntegerField(min_value=1, validators=[validate_food])
<...>

validator.py

  <...>

def validate_food(daily_food_min, daily_food_max):
    if daily_food_min > daily_food_max:
        raise ValidationError(
            _('(daily_food_min) Kg. is higher then max.'),
            params={
                'daily_food_max': daily_food_max,
                'daily_food_min': daily_food_min,                  
                    },
        )

К сожалению, я получаю я Сообщение об ошибке , когда я заполняю свою HTML-форму:

TypeError: validate_food() missing 1 required positional argument: 'daily_food_max'

как я могу отправить оба значения в мою проверку или объявить позиционный аргумент?

1 Ответ

0 голосов
/ 24 сентября 2019

Хорошо, благодаря подсказке @Jordan M. в документах, я разобрался с этим умом, который работал со мной.

Я написал clean() метод, и это моя обновленная форма.

forms.py

class AnimalForm(forms.ModelForm):
    weight = forms.DecimalField(validators=[validate_gtr])
    daily_food_min = forms.IntegerField(min_value=0)
    daily_food_max = forms.IntegerField(min_value=1)

    class Meta:
        model = Animal
        fields = [
            'name',
            'weight',
            'daily_food_min',
            'daily_food_max',          
            'species',
            'farmer',    
        ]

    def __init__(self, *args, **kwargs):
        super(AnimalForm, self).__init__(*args, **kwargs)
        self.fields['name'].help_text = 'Name of Animal'
        self.fields['weight'].help_text = 'Weight in Kg'
        self.fields['species'].help_text = 'choose a species'

    def clean(self):
            cleaned_data = super().clean()
            daily_food_min = cleaned_data.get("daily_food_min")
            daily_food_max = cleaned_data.get("daily_food_max")

            if daily_food_min and daily_food_max:
                # Only do something if both fields are valid so far.
                if daily_food_min > daily_food_max:
                    raise forms.ValidationError(
                        "Food min. has to be less then Food max."
                    )
...