Проверка max_length Django TextField для ModelForm - PullRequest
28 голосов
/ 08 июля 2010

Django не учитывает атрибут max_length поля модели TextField при проверке ModelForm.

Таким образом, я определяю LimitedTextField, унаследованное от models.TextField и добавляя биты проверки, аналогичные модели .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 ]

73 голосов
/ 09 июля 2010

Начиная с 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, который применяется только на стороне клиента, Смотрите здесь

10 голосов
/ 09 июля 2010

Вы можете установить максимальную длину для TextField, определив CharField с виджетом Textarea следующим образом:

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 голосов
/ 08 июня 2018

Нет необходимости импортировать MaxLengthValidator из валидаторов для Django 2.x

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