2010-07-08 12 views
26

Django non rispetta l'attributo max_length del campo del modello TextField durante la convalida di un ModelForm.Django TextField validazione max_length per ModelForm

Così mi definiscono un LimitedTextField ereditato dal models.TextField e ha aggiunto la convalida bit simile a 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) 

Ma questo ancora non ha alcun effetto sulla convalida ModelForm.

Cosa mi manca? Ogni aiuto è molto apprezzato.

Grazie,

OMAT

risposta

69

Come di Django 1.2 questo può essere fatto dai validatori a livello di modello, come spiegato qui: https://docs.djangoproject.com/en/stable/ref/validators/

from django.core.validators import MaxLengthValidator 

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

Dal momento che Django 1.7, è possibile utilizzare max_length che viene applicata solo sul lato client. See here

+6

Da django 1.7, puoi usare l'attributo 'max_length' in TextField –

10

È possibile applicare una lunghezza massima per un TextField definendo un CharField con un widget Textarea come questo:

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

ma poi dovrei ripetere questo per ogni campo di testo che voglio limitare. sarebbe molto meglio se non fosse richiesto nient'altro che specificare la lunghezza massima. – omat

+1

Sì, specificare max_length nel modello sarebbe un po 'più semplice, ma la soluzione che ho offerto è l'approccio standard che troverai in molte app di django e persino all'interno di django stesso (vedi django.contrib.com). Devo ancora vedere il campo di testo personalizzato che stai descrivendo. In bocca al lupo. –