2010-07-08 18 views
26

Django no respeta el atributo max_length del campo de modelo TextField al validar un ModelForm.Django TextField max_length validación para ModelForm

Así que definen un LimitedTextField heredado de la models.TextField y ha añadido la validación de los bits similar 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) 

Pero esto todavía no tiene ningún efecto sobre la validación ModelForm.

¿Qué me estoy perdiendo? Cualquier ayuda es muy apreciada.

Gracias,

Omat

Respuesta

69

A partir de Django 1.2 esto se puede hacer por validadores a nivel de modelo, como se explica aquí: https://docs.djangoproject.com/en/stable/ref/validators/

from django.core.validators import MaxLengthValidator 

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

Desde Django 1.7, puede usar max_length, que solo se aplica en el lado del cliente. See here

+6

Desde django 1.7, yon puede usar el atributo 'max_length' en TextField –

10

Puede cumplir una longitud máxima para un campo de texto mediante la definición de un CharField con un widget Área de texto así:

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

pero luego debería repetir esto para cada campo de texto que quiero limitar. Sería mucho mejor si no se requiere nada más que especificar max_length. – omat

+1

Sí, especificar un max_length en el modelo sería un poco más fácil, pero la solución que ofrezco es el enfoque estándar que encontrará en muchas aplicaciones de django, e incluso dentro de django (consulte django.contrib.comments). Aún no he visto el TextField personalizado que está describiendo. Buena suerte. –

Cuestiones relacionadas