Django的 – 如何指定validation失败的领域?

我在pipe理页面中显示了这个模型:

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!") 

正如你所看到的,我对模型进行了validation。 但是,我想要发生的是pipe理页面显示bark_volume字段旁边的错误,而不是像现在这样的一般错误。 有没有办法指定哪个字段的validation失败?

非常感谢提前。

好的,我从这个答案中得出了答案 。

你必须这样做:

 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!",]}) 
 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!') 

至less在表单上起作用。 从未尝试过模型本身,但方法应该是相同的。 但是,从Django文档:

当您使用ModelForm时,对is_valid()的调用将为窗体上包含的所有字段执行这些validation步骤。 (有关更多信息,请参阅ModelForm文档。)如果打算自己处理validation错误,或者已经从ModelForm中排除需要validation的字段,则只需调用模型的full_clean()方法即可。

和…

请注意,调用模型的save()方法时,不会自动调用full_clean(),也不会因为ModelFormvalidation而自动调用full_clean()。 当您想要在ModelForm之外运行模型validation时,您需要手动调用它。

所以,基本上,除非你有充分的理由在模型上进行现场清理,否则你应该在表单上做。 代码如下所示:

 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 

那肯定会起作用。

使用特定于该字段的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而不是表单域本身; 后者可能有旧的数据。 最后,在表格上做这个,而不是模型。

要注意任何可能碰到这个新版本的Django的人 – 从接受的答案中的clean_fields方法现在需要一个“排除”参数。 另外 – 我相信接受的答案也缺less一个调用它的超级function。 我使用的最终代码是:

 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"]}) 

validation这个特定情况的最简单的方法是:

 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关于validation器的文档: https : //docs.djangoproject.com/en/dev/ref/validators/

缩写,从Django的文档 :

 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