【问题标题】:Django TextField max_length validation for ModelFormModelForm 的 Django TextField max_length 验证
【发布时间】:2011-03-13 12:33:43
【问题描述】:

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 验证没有影响。

我错过了什么?

【问题讨论】:

    标签: django django-validation


    【解决方案1】:

    从 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

    【讨论】:

    • 从 django 1.7 开始,你可以在 TextField 中使用 max_length 属性
    【解决方案2】:

    您可以通过使用 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',)
    

    【讨论】:

    • 但是我应该对我想要限制的每个文本字段重复此操作。如果除了指定 max_length 之外没有其他要求,那就更好了。
    • 是的,在模型中指定 max_length 会更容易一些,但我提供的解决方案是您可以在许多 django 应用程序中找到的标准方法,甚至在 django 本身中(参见 django.contrib.cmets )。我还没有看到您描述的自定义 TextField。祝你好运。
    【解决方案3】:

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

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

    【讨论】:

    • 最好在答案中添加一些解释。 ;)
    • 来自文档:如果您指定 max_length 属性,它将反映在自动生成的表单字段的 Textarea 小部件中。但是,它在模型或数据库级别未强制执行。
    猜你喜欢
    • 2012-09-30
    • 2011-01-09
    • 2013-11-26
    • 2013-08-22
    • 2012-05-23
    • 2020-09-05
    • 2017-10-06
    • 2016-05-07
    相关资源
    最近更新 更多