id,summary,reporter,owner,description,type,status,component,version,severity,resolution,keywords,cc,stage,has_patch,needs_docs,needs_tests,needs_better_patch,easy,ui_ux 22206,"TextField doesn't set max_length attribute on its formfield, unlike CharField",Chris Wilson,Chris Wilson,"In django/db/models/fields/__init__.py, the CharField field type constructs its widgets with a max_length parameter, which ends up in the widget: {{{ class CharField(Field): # django.db.forms.fields def formfield(self, **kwargs): # Passing max_length to forms.CharField means that the value's length # will be validated twice. This is considered acceptable since we want # the value in the form field (to pass into widget for example). defaults = {'max_length': self.max_length} defaults.update(kwargs) return super(CharField, self).formfield(**defaults) class CharField(Field): # django.forms.fields def widget_attrs(self, widget): attrs = super(CharField, self).widget_attrs(widget) if self.max_length is not None and isinstance(widget, TextInput): # The HTML attribute is maxlength, not max_length. attrs.update({'maxlength': str(self.max_length)}) return attrs }}} But nothing like this happens for the TextField database field, which creates a TextField form field, which uses a Textarea widget by default: {{{ class TextField(Field): description = _(""Text"") def formfield(self, **kwargs): defaults = {'widget': forms.Textarea} defaults.update(kwargs) return super(TextField, self).formfield(**defaults) }}} I think that TextField doesn't override form_class, so it gets the default CharField from Field.formfield(), as CharField does, but with a custom widget. So all we'd need to do is set the attribute in the CharField db field: {{{ def formfield(self, **kwargs): # Passing max_length to forms.CharField means that the value's length # will be validated twice. This is considered acceptable since we want # the value in the form field (to pass into widget for example). defaults = {'max_length': self.max_length} defaults.update(kwargs) return super(TextField, self).formfield(**defaults) }}} and add the attribute to the widget in CharField: {{{ def widget_attrs(self, widget): attrs = super(CharField, self).widget_attrs(widget) if self.max_length is not None: # all types of widgets, not hard coded # The HTML attribute is maxlength, not max_length. attrs.update({'maxlength': str(self.max_length)}) return attrs }}}",New feature,closed,Forms,dev,Normal,fixed,,,Accepted,1,0,0,0,0,0