django - Django:如何在两个FormFields之间验证/验证一个“更大的”?
问题描述
我正在 Django 中测试编写验证器。到目前为止它有效,但现在我想写一些类似“范围”的东西。
表格.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'
验证器.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
相互对抗,这意味着在保存或在我的 html 表单中输入数字时,daily_food_max
它必须更大。daily_food_min
这是我的方法
表格.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])
<...>
验证器.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'
如何将这两个值发送到我的验证或声明位置参数?
解决方案
好的,感谢文档中的@Jordan M. 提示,我想出了这个对我有用的灵魂。
我写了一个clean()
方法,这是我更新的表格。
表格.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."
)
推荐阅读
- r - R visNetwork:自定义折叠行为以压缩图形可视化
- javascript - 这个变量无处不在
- javascript - 如何在 ajax 页面中为计时器编写代码,以便计时器在页面重新加载时不会更改
- kubernetes - 作业完成后,K8s 作业(容器)中指定的内存请求/限制会发生什么情况?
- java - Spring + REST 的漂亮打印参数
- angular - 无法读取未定义 ngx-toastr 的属性“推送”中的错误
- virtual-machine - 2 个 FR 之间的 IBM MQ 集群发送方通道不断重试
- hibernate - 绑定到 weblogic JTA 时,Hibernate 未释放 weblogic 数据源的连接
- reactjs - 在 Netlify 上调试 Gatsby 构建失败(无法解析组件)
- python - 如何在 pandas DataFrame 中格式化特殊小数