首页 文章

ModelForm的Django TextField max_length验证

提问于
浏览
27

在验证ModelForm时,Django不尊重TextField模型字段的max_length属性 .

所以我定义了一个继承自models.TextField的LimitedTextField,并添加了类似于models.CharField的验证位:

from django.core import validators

class LimitedTextField(models.TextField):
    def __init__(self, *args, **kwargs):
        super(LimitedTextField, self).__init__(*args, **kwargs)
        self.max_length = kwargs.get('max_length')
        if self.max_length:
            self.validators.append(validators.MaxLengthValidator(self.max_length))

    def formfield(self, **kwargs):
        defaults = {'max_length': self.max_length}
        defaults.update(kwargs)
        return super(LimitedTextField, self).formfield(**defaults)

但这对ModelForm验证仍然没有影响 .

我错过了什么?任何帮助深表感谢 .

谢谢,

OMAT

3 回答

  • 10

    从Django 1.2开始,这可以通过模型级别的验证器完成,如下所述:https://docs.djangoproject.com/en/stable/ref/validators/

    from django.core.validators import MaxLengthValidator
    
    class Comment(models.Model):
        comment = models.TextField(validators=[MaxLengthValidator(200)])
    

    从Django 1.7开始,你可以使用 max_length ,它只在客户端强制执行 . See here

  • 70

    您可以通过使用Textarea小部件定义CharField来强制TextField的最大长度,如下所示:

    class MyClass(models.Model):
        textfield = models.TextField()
    
    class MyForm(forms.ModelForm):
        textfield = forms.CharField(
            max_length = 50,
            widget = forms.Textarea
        )
    
        class Meta:
            model = MyClass
            fields = ('textfield',)
    
  • 0

    无需从Django 2.x的验证器导入MaxLengthValidator

    from django.db import models
    class Comment(models.Model):
      comment = models.TextField(max_length=200)
    

相关问题