Я тестирую написание валидатора в 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'
как я могу отправить оба значения в мою проверку или объявить позиционный аргумент?