Pergunta

Django não respeitar o atributo max_length de TextField modelo de campo durante a validação de um ModelForm.

Assim que eu definir um LimitedTextField herdadas dos modelos.TextField e adicionados bits de validação, semelhante aos 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)

Mas isso ainda não tem nenhum efeito sobre ModelForm de validação.

O que eu estou ausente?Qualquer ajuda é muito apreciada.

Obrigado,

oMat

Foi útil?

Solução

Como de Django 1.2 isso pode ser feito por agentes de validação no nível do modelo, como explicado aqui: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, você pode usar max_length o que só é executada no lado do cliente. Veja aqui

Outras dicas

Você pode aplicar um comprimento máximo para um campo de texto com a definição de uma CharField com um Textarea widget 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',)

Não há necessidade de importar MaxLengthValidator de validadores para Django 2.x

from django.db import models
class Comment(models.Model):
  comment = models.TextField(max_length=200)
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top