Pregunta

Django no respeta el atributo max_length del campo modelo TextField al validar un ModelForm.

Así que defino un LimitedTextField heredado de models.TextField y agregué bits de validación similares 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 en la validación de ModelForm.

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

Gracias,

oMat

¿Fue útil?

Solución

A partir de Django 1.2, esto lo pueden hacer los 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, puedes usar max_length que solo se aplica en el lado del cliente. Mira aquí

Otros consejos

Puede hacer cumplir una longitud máxima para un campo de texto definiendo un campio de caricias con un widget de texto 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',)

No es necesario importar maxlengthvalidator desde validadores para Django 2.x

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top