gpt4 book ai didi

python - Django 模型的 clean() 方法不会引发各个字段的预期 ValidationErrors

转载 作者:行者123 更新时间:2023-12-01 02:05:03 26 4
gpt4 key购买 nike

我有一个名为 CheckIn 的 Django 模型,其中包含两个字段:min_weeksmax_weeks。我想建立验证,使 min_weeks 始终小于或等于 max_weeks。正在关注https://docs.djangoproject.com/en/dev/ref/models/instances/?from=olddo#django.db.models.Model.clean (特别是在最后一个示例中, ValidationError 传递了一个将字段映射到错误的字典),我尝试了以下 clean() 方法:

from django.db import models
from django.core.exceptions import ValidationError


class CheckIn(models.Model):
min_weeks = models.IntegerField(blank=True, null=True)
max_weeks = models.IntegerField(blank=True, null=True)

def clean(self):
if self.min_weeks > self.max_weeks:
raise ValidationError({
'min_weeks': ValidationError("'min_weeks' should be smaller than 'max_weeks'", code='invalid'),
'max_weeks': ValidationError("'max_weeks' should be greater than 'min_weeks'", code='invalid')})

该模型在 ModelForm 中使用:

class CheckInForm(forms.ModelForm):
class Meta:
model = CheckIn
fields = [
'min_weeks',
'max_weeks',
]

这些字段在模板中手动显示。以下是摘录:

<div class="row">
<div class="input-field col s4">
<div class="js-hide-edit-field-text {% if not check_in_type or form.min_weeks.value %}hide{% endif %}">
{% if check_in_type and not form.min_weeks.value %}
<span class='js-max-weeks inherited-field text'>{{ check_in_type.min_weeks }}</span>
<a href='#' class='js-hide-edit-field-edit edit-icon right'><i class="material-icons">mode_edit</i></a>
<label class="active">
Min Weeks
</label>
{% endif %}
</div>
<div class="js-hide-edit-field {% if check_in_type and not form.min_weeks.value %}hide{% endif %}">
{{ form.min_weeks|add_error_class:"invalid"|attr:"data-duration-weeks-mask" }}
{{ form.min_weeks.errors }}
{{ form.min_weeks|label_with_classes }}
</div>
</div>

<div class="input-field col s4">
<div class="js-hide-edit-field-text {% if not check_in_type or form.max_weeks.value %}hide{% endif %}">
{% if check_in_type and not form.max_weeks.value %}
<span class='js-min-weeks inherited-field text'>{{ check_in_type.max_weeks }}</span>
<a href='#' class='js-hide-edit-field-edit edit-icon right'><i class="material-icons">mode_edit</i></a>
<label class="active">
Max Weeks
</label>
{% endif %}
</div>
<div class="js-hide-edit-field {% if check_in_type and not form.max_weeks.value %}hide{% endif %}">
{{ form.max_weeks|add_error_class:"invalid"|attr:"data-duration-weeks-mask" }}
{{ form.max_weeks.errors }}
{{ form.max_weeks|label_with_classes }}
</div>
</div>
</div>

请注意,如果未明确提供,这里有一些额外的逻辑可以从 CheckInCheckInType 中“继承”值。不过,总的来说,模板仅显示 form.min_weeksform.max_weeks 以及相应的错误。

问题是,如果我为 min_weeksmax_weeks 输入无效值,我会看到与预期不同的错误消息(即“输入一个整数”)而不是“'min_weeks' 应小于 'max_weeks'”):

enter image description here

这更令人费解,因为我输入了整数。知道这里可能出现什么问题吗?

最佳答案

似乎传递 code='invalid' 关键字参数是导致它引发此默认错误消息的原因。如果我修改 Model.clean() 方法如下:

def clean(self):
if self.min_weeks > self.max_weeks:
raise ValidationError({
'min_weeks': ValidationError("'min_weeks' should be smaller than 'max_weeks'"),
'max_weeks': ValidationError("'max_weeks' should be greater than 'min_weeks'")})

然后错误将按预期显示:

enter image description here

顺便说一句,我找到这个问题的方法是查看 Django 的 IntegerField 的源代码,它的开头如下:

class IntegerField(Field):
widget = NumberInput
default_error_messages = {
'invalid': _('Enter a whole number.'),
}

关于python - Django 模型的 clean() 方法不会引发各个字段的预期 ValidationErrors,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49160381/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com