not formularios form fields example django django-models django-forms django-validation

formularios - Validación Django TextField max_length para ModelForm



submit django form (3)

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

Así que defino un LimitedTextField heredado de los modelos. TextField y bits de validación agregados similares a los modelos.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 aún no tiene efecto en la validación de ModelForm.

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

Gracias,

oMat


A partir de Django 1.2, esto se puede hacer mediante 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. Mira aquí


No es necesario importar MaxLengthValidator de validadores para Django 2.x

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


Puede aplicar una longitud máxima para un Campo de texto definiendo un CharField con un widget Textarea como este:

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