我有这个模型,我在管理页面中显示:
class Dog(models.Model):
bark_volume = models.DecimalField(...
unladen_speed = models.DecimalField(...
def clean(self):
if self.bark_volume < 5:
raise ValidationError("must be louder!")
如您所见,我对模型进行了验证。但我想要发生的是管理页面显示bark_volume字段旁边的错误,而不是像现在这样的一般错误。有没有办法指定验证失败的哪个字段?
提前非常感谢。
答案 0 :(得分:94)
好的,我想出了from this answer。
你必须做这样的事情:
class Dog(models.Model):
bark_volume = models.DecimalField(...
unladen_speed = models.DecimalField(...
def clean_fields(self):
if self.bark_volume < 5:
raise ValidationError({'bark_volume': ["Must be louder!",]})
答案 1 :(得分:12)
class Dog(models.Model):
bark_volume = models.DecimalField(...
unladen_speed = models.DecimalField(...
def clean(self):
if self.bark_volume < 5:
if not self._errors.has_key('bark_volume'):
from django.forms.util import ErrorList
self._errors['bark_volume'] = ErrorList()
self._errors['bark_volume'].append('must be louder!')
至少在形式上有效。从来没有尝试过模型本身,但方法应该是相同的。但是,来自Django文档:
使用ModelForm时,对is_valid()的调用将对表单中包含的所有字段执行这些验证步骤。 (有关详细信息,请参阅ModelForm文档。)如果您计划自己处理验证错误,或者您已从ModelForm中排除了需要验证的字段,则只需要调用模型的full_clean()方法。
和...
请注意,调用模型的save()方法时,也不会自动调用full_clean(),也不会因模型化验证而调用。如果要在ModelForm之外运行模型验证,则需要手动调用它。
所以,基本上,除非你有充分的理由在模型上进行现场清理,否则你应该在表格上进行。代码如下:
class DogForm(forms.ModelForm):
def clean(self):
bark_volume = self.cleaned_data.get('bark_volume')
if bark_volume < 5:
if not self._errors.has_key('bark_volume'):
from django.forms.util import ErrorList
self._errors['bark_volume'] = ErrorList()
self._errors['bark_volume'].append('must be louder!')
return self.cleaned_data
这肯定会奏效。
答案 2 :(得分:7)
要注意任何人可能会遇到更新版本的Django - 现在接受的答案中的clean_fields方法需要&#34;排除&#34; PARAM。此外 - 我相信接受的答案也缺少对它的超级功能的调用。我使用的最终代码是:
def clean_fields(self, exclude=None):
super(Model, self).clean_fields(exclude)
if self.field_name and not self.field_name_required:
raise ValidationError({'field_name_required':["You selected a field, so field_name_required is required"]})
答案 3 :(得分:6)
使用特定于该字段的clean_
方法:
class DogForm(forms.ModelForm):
class Meta:
model = Dog
def clean_bark_volume(self):
if self.cleaned_data['bark_volume'] < 5:
raise ValidationError("must be louder!")
请参阅Form Validation页面的clean<fieldname>
部分。另外,请务必使用cleaned_data
而不是表单字段本身;后者可能有旧数据。最后,在表单而不是模型上执行此操作。
答案 4 :(得分:4)
验证此特定案例的最简单方法是:
from django.core.validators import MinValueValidator
from django.utils.translation import ugettext_lazy as _
class Dog(models.Model):
bark_volume = models.DecimalField(
..., validators=[MinValueValidator(5, message=_("Must be louder!"))]
Django关于验证器的文档:https://docs.djangoproject.com/en/dev/ref/validators/
答案 5 :(得分:2)
缩写,来自django docs:
def clean(self):
data = self.cleaned_data
subject = data.get("subject")
if subject and "help" not in subject:
msg = "Must put 'help' in subject."
self.add_error('subject', msg)
return data