Validación de Django TextField max_length para ModelForm
-
13-09-2020 - |
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
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)