web-dev-qa-db-ja.com

Django ModelFormのTextField max_length検証

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の検証には影響しません。

何が欠けていますか?どんな助けでも大歓迎です。

おかげで、

oMat

29
onurmatik

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クライアント側でのみ適用されます。 こちらをご覧ください

73
omat

次のように、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',)
10

Django 2.xのバリデーターからMaxLengthValidatorをインポートする必要はありません

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