django在验证ModelForm时不尊重TextField模型字段的Max_Length属性。

所以我定义了从模型继承的有限的文本.TextField并添加了类似于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)
.

但这仍然没有影响型号验证。

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

谢谢,

omat

有帮助吗?

解决方案

作为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以来,您可以使用仅在客户端强制执行的生成频率测定代码。查看此处

其他提示

您可以通过定义具有如此的TextAlea小部件的Charfield来强制为文本字段执行最大长度:

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的validators导入maxlengthvalidator

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top