ModelForm的Django TextField max_length验证

Django TextField max_length validation for ModelForm

Django在验证模型窗体时不考虑textfield model字段的max_length属性。

因此,我定义了继承自models.textfield的limitedtextfield,并添加了类似models.charfield的验证位:

1
2
3
4
5
6
7
8
9
10
11
12
13
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)

但这对模型表单验证仍然没有影响。

我错过了什么?任何帮助都非常感谢。

谢谢,

奥马特


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

1
2
3
4
from django.core.validators import MaxLengthValidator

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

由于django 1.7,您可以使用max_length,它只在客户端强制执行。请看这里


您可以通过使用如下文本区域小部件定义charfield来强制textfield的最大长度:

1
2
3
4
5
6
7
8
9
10
11
12
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',)


不需要从django 2.x的验证程序导入maxlengthvalidator

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