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