From 95c74b9d699c29fe808684774548e2864d64665a Mon Sep 17 00:00:00 2001 From: Chris Wilson Date: Tue, 4 Mar 2014 14:12:13 +0000 Subject: [PATCH] Fixed #22206 -- Passed models.TextField.max_length to forms.CharField.maxlength --- AUTHORS | 1 + django/db/models/fields/__init__.py | 5 ++++- django/forms/fields.py | 2 +- docs/ref/models/fields.txt | 7 +++++++ docs/releases/1.7.txt | 4 ++++ tests/forms_tests/tests/test_fields.py | 9 ++++----- tests/model_fields/tests.py | 15 +++++++++++++++ tests/model_forms/tests.py | 2 +- 8 files changed, 37 insertions(+), 8 deletions(-) diff --git a/AUTHORS b/AUTHORS index f611c90fae..747c3bc6a8 100644 --- a/AUTHORS +++ b/AUTHORS @@ -666,6 +666,7 @@ answer newbie questions, and generally made Django that much better: Rachel Willmer Jakub Wilk Ian A Wilson + Chris Wilson Jakub Wiśniowski Maciej Wiśniowski wojtek diff --git a/django/db/models/fields/__init__.py b/django/db/models/fields/__init__.py index 25ac74caee..5e94e78c58 100644 --- a/django/db/models/fields/__init__.py +++ b/django/db/models/fields/__init__.py @@ -1850,7 +1850,10 @@ class TextField(Field): return smart_text(value) def formfield(self, **kwargs): - defaults = {'widget': forms.Textarea} + # 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, 'widget': forms.Textarea} defaults.update(kwargs) return super(TextField, self).formfield(**defaults) diff --git a/django/forms/fields.py b/django/forms/fields.py index 8b5fd2c55e..1866bc1786 100644 --- a/django/forms/fields.py +++ b/django/forms/fields.py @@ -223,7 +223,7 @@ class CharField(Field): def widget_attrs(self, widget): attrs = super(CharField, self).widget_attrs(widget) - if self.max_length is not None and isinstance(widget, TextInput): + if self.max_length is not None: # The HTML attribute is maxlength, not max_length. attrs.update({'maxlength': str(self.max_length)}) return attrs diff --git a/docs/ref/models/fields.txt b/docs/ref/models/fields.txt index 4e02c66ca0..b3523334c0 100644 --- a/docs/ref/models/fields.txt +++ b/docs/ref/models/fields.txt @@ -968,6 +968,13 @@ databases supported by Django. A large text field. The default form widget for this field is a :class:`~django.forms.Textarea`. +.. versionchanged:: 1.7 + + If you specify a ``max_length`` attribute, it will be reflected in the + :class:`~django.forms.Textarea` widget of the auto-generated form field. + However it is not enforced at the model or database level. Use a + :class:`CharField` for that. + .. admonition:: MySQL users If you are using this field with MySQLdb 1.2.1p2 and the ``utf8_bin`` diff --git a/docs/releases/1.7.txt b/docs/releases/1.7.txt index 441a39616a..096415c5b8 100644 --- a/docs/releases/1.7.txt +++ b/docs/releases/1.7.txt @@ -488,6 +488,10 @@ Forms Each radio button or checkbox includes an ``id_for_label`` attribute to output the element's ID. +* The ``', + '', ) self.assertHTMLEqual( str(form['url']),