32

Django 在验证 ModelForm 时不尊重 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 验证没有影响。

我错过了什么?

4

3 回答 3

82

从 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仅在客户端强制执行的。看这里

于 2010-07-09T12:58:55.500 回答
11

您可以通过使用 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',)
于 2010-07-09T03:10:45.063 回答
1

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

from django.db import models
class Comment(models.Model):
  comment = models.TextField(max_length=200)
于 2018-06-08T10:35:10.647 回答