web-dev-qa-db-fra.com

Validation Django TextField max_length pour ModelForm

Django ne respecte pas l'attribut max_length du champ de modèle TextField lors de la validation d'un ModelForm. 

Donc, je définis un LimitedTextField hérité de models.TextField et ajouté des bits de validation similaires à 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)

Mais cela n'a toujours aucun effet sur la validation de ModelForm. 

Qu'est-ce que je rate? Toute aide est très appréciée.

Merci,

oMat

27
omat

À partir de Django 1.2, cela peut être fait par les validateurs au niveau du modèle, comme expliqué ici: https://docs.djangoproject.com/fr/stable/ref/validators/

from Django.core.validators import MaxLengthValidator

class Comment(models.Model):
    comment = models.TextField(validators=[MaxLengthValidator(200)])

Depuis Django 1.7, vous pouvez utiliser max_length qui n’est appliqué que côté client. Vois ici

71
omat

Vous pouvez imposer une longueur maximale à un objet TextField en définissant un objet CharField avec un widget Textarea, comme suit:

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
Michael Godshall

Pas besoin d'importer MaxLengthValidator à partir de validateurs pour Django 2.x

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