Fixed #26516 -- Added minlength attribute when forms.CharField.min_length is set.
This commit is contained in:
parent
836d475afe
commit
500e5a6886
|
@ -235,7 +235,10 @@ class CharField(Field):
|
|||
attrs = super(CharField, self).widget_attrs(widget)
|
||||
if self.max_length is not None:
|
||||
# The HTML attribute is maxlength, not max_length.
|
||||
attrs.update({'maxlength': str(self.max_length)})
|
||||
attrs['maxlength'] = str(self.max_length)
|
||||
if self.min_length is not None:
|
||||
# The HTML attribute is minlength, not min_length.
|
||||
attrs['minlength'] = str(self.min_length)
|
||||
return attrs
|
||||
|
||||
|
||||
|
|
|
@ -256,6 +256,9 @@ Forms
|
|||
* Form and widget ``Media`` is now served using
|
||||
:mod:`django.contrib.staticfiles` if installed.
|
||||
|
||||
* The ``<input>`` tag rendered by :class:`~django.forms.CharField` now includes
|
||||
a ``minlength`` attribute if the field has a ``min_length``.
|
||||
|
||||
Generic Views
|
||||
~~~~~~~~~~~~~
|
||||
|
||||
|
|
|
@ -81,17 +81,30 @@ class CharFieldTest(FormFieldAssertionsMixin, SimpleTestCase):
|
|||
"""
|
||||
CharField.widget_attrs() always returns a dictionary (#15912).
|
||||
"""
|
||||
# Return an empty dictionary if max_length is None
|
||||
# Return an empty dictionary if max_length and min_length are both None.
|
||||
f = CharField()
|
||||
self.assertEqual(f.widget_attrs(TextInput()), {})
|
||||
self.assertEqual(f.widget_attrs(Textarea()), {})
|
||||
|
||||
# Otherwise, return a maxlength attribute equal to max_length
|
||||
# Return a maxlength attribute equal to max_length.
|
||||
f = CharField(max_length=10)
|
||||
self.assertEqual(f.widget_attrs(TextInput()), {'maxlength': '10'})
|
||||
self.assertEqual(f.widget_attrs(PasswordInput()), {'maxlength': '10'})
|
||||
self.assertEqual(f.widget_attrs(Textarea()), {'maxlength': '10'})
|
||||
|
||||
# Return a minlength attribute equal to min_length.
|
||||
f = CharField(min_length=5)
|
||||
self.assertEqual(f.widget_attrs(TextInput()), {'minlength': '5'})
|
||||
self.assertEqual(f.widget_attrs(PasswordInput()), {'minlength': '5'})
|
||||
self.assertEqual(f.widget_attrs(Textarea()), {'minlength': '5'})
|
||||
|
||||
# Return both maxlength and minlength when both max_length and
|
||||
# min_length are set.
|
||||
f = CharField(max_length=10, min_length=5)
|
||||
self.assertEqual(f.widget_attrs(TextInput()), {'maxlength': '10', 'minlength': '5'})
|
||||
self.assertEqual(f.widget_attrs(PasswordInput()), {'maxlength': '10', 'minlength': '5'})
|
||||
self.assertEqual(f.widget_attrs(Textarea()), {'maxlength': '10', 'minlength': '5'})
|
||||
|
||||
def test_charfield_strip(self):
|
||||
"""
|
||||
Values have whitespace stripped but not if strip=False.
|
||||
|
|
|
@ -42,7 +42,7 @@ class EmailFieldTest(FormFieldAssertionsMixin, SimpleTestCase):
|
|||
|
||||
def test_emailfield_min_max_length(self):
|
||||
f = EmailField(min_length=10, max_length=15)
|
||||
self.assertWidgetRendersTo(f, '<input id="id_f" type="email" name="f" maxlength="15" />')
|
||||
self.assertWidgetRendersTo(f, '<input id="id_f" type="email" name="f" maxlength="15" minlength="10" />')
|
||||
with self.assertRaisesMessage(ValidationError, "'Ensure this value has at least 10 characters (it has 9).'"):
|
||||
f.clean('a@foo.com')
|
||||
self.assertEqual('alf@foo.com', f.clean('alf@foo.com'))
|
||||
|
|
|
@ -91,7 +91,7 @@ class URLFieldTest(FormFieldAssertionsMixin, SimpleTestCase):
|
|||
|
||||
def test_urlfield_5(self):
|
||||
f = URLField(min_length=15, max_length=20)
|
||||
self.assertWidgetRendersTo(f, '<input id="id_f" type="url" name="f" maxlength="20" />')
|
||||
self.assertWidgetRendersTo(f, '<input id="id_f" type="url" name="f" maxlength="20" minlength="15" />')
|
||||
with self.assertRaisesMessage(ValidationError, "'Ensure this value has at least 15 characters (it has 12).'"):
|
||||
f.clean('http://f.com')
|
||||
self.assertEqual('http://example.com', f.clean('http://example.com'))
|
||||
|
|
Loading…
Reference in New Issue