2010-07-08 4 views
26

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

Je définir une LimitedTextField héritée de la validation des bits models.TextField et ajouté similaire à 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 encore aucun effet sur la validation ModelForm.

Qu'est-ce qui me manque? Toute aide est très appréciée.

Merci,

OMat

Répondre

69

A partir de Django 1.2 cela peut être fait par validateurs au niveau du modèle, comme expliqué ici: https://docs.djangoproject.com/en/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 est seulement appliqué du côté client. See here

+6

Depuis django 1.7, vous pouvez utiliser l'attribut 'max_length' dans TextField –

10

Vous pouvez appliquer une longueur maximale pour un champ de texte en définissant un CharField avec un widget Textarea comme ceci:

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',) 
+1

mais alors je devrais le répéter pour chaque champ de texte que je veux limiter. ce serait beaucoup mieux si rien d'autre ne spécifie max_length est requis. – omat

+1

Oui, spécifier max_length dans le modèle serait un peu plus facile, mais la solution que j'ai proposée est l'approche standard que vous trouverez dans de nombreuses applications django, et même dans django lui-même (voir django.contrib.comments). Je n'ai pas encore vu le TextField personnalisé que vous décrivez. Bonne chance. –

Questions connexes