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 に答える