34

Django does not respect the max_length attribute of TextField model field while validating a ModelForm.

So I define a LimitedTextField inherited from the models.TextField and added validation bits similar to 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) 

But this still has no affect on ModelForm validation.

What am I missing?

3 Answers 3

84

As of Django 1.2 this can be done by validators at model level, as explained here: https://docs.djangoproject.com/en/stable/ref/validators/

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

Since Django 1.7, you can use max_length which is only enforced in client side. See here

Sign up to request clarification or add additional context in comments.

1 Comment

From django 1.7, yon can use max_length attribute in TextField
12

You can enforce a max length for a TextField by defining a CharField with a Textarea widget like this:

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

2 Comments

but then i should repeat this for every text field that i want to limit. it would be much better if nothing other then specifying max_length is required.
Yes, specifying max_length in the model would be a little easier, but the solution I offered is the standard approach you will find in many django apps, and even within django itself (see django.contrib.comments). I have yet to see the custom TextField you are describing. Good luck.
0

No need to import MaxLengthValidator from validators for Django 2.x

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

2 Comments

It's always better to add some explanation to the answer. ;)
From the doc: If you specify a max_length attribute, it will be reflected in the Textarea widget of the auto-generated form field. However it is NOT ENFORCED at the model or database level.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.