Django-如何指定验证失败的字段?

| 我在管理页面中显示了该模型:
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字段旁边显示错误,而不是像现在这样显示一般错误。有没有一种方法可以指定验证失败的字段? 提前非常感谢。     
已邀请:
        好的,我从这个答案中弄清楚了。 您必须执行以下操作:
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!\')
至少在表单上有效。从未在模型本身上尝试过,但是方法应该相同。但是,从Django文档中:   当您使用ModelForm时,对is_valid()的调用将对表单中包括的所有字段执行这些验证步骤。 (有关更多信息,请参见ModelForm文档。)仅当您计划自己处理验证错误,或者从ModelForm中排除了需要验证的字段时,才需要调用模型的full_clean()方法。 和...   请注意,当您调用模型的save()方法时或由于ModelForm验证而不会自动调用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
这肯定会起作用。     
        要为任何可能与较新版本的Django碰到的人注意-接受的答案中的clean_fields方法现在需要一个\“ exclude \”参数。另外-我相信公认的答案也缺少对其超级功能的调用。我使用的最终代码是:
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\"]})
    
        使用特定于该字段的
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!\")
请参阅“表单验证”页面的“ 7”部分。另外,请确保使用
cleaned_data
代替表单字段本身;后者可能有旧数据。最后,在表单而不是模型上执行此操作。     
        验证此特殊情况的最简单方法是:
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/     
        缩写,来自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
    

要回复问题请先登录注册