From 3569ba0333ef7f90640aa2042339451705d20114 Mon Sep 17 00:00:00 2001 From: Claude Paroz Date: Fri, 5 Aug 2016 11:38:39 +0200 Subject: [PATCH] Fixed #27015 -- Prevented HTML-invalid minlength/maxlength on hidden inputs --- django/forms/fields.py | 4 ++-- tests/forms_tests/field_tests/test_charfield.py | 7 +++++-- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/django/forms/fields.py b/django/forms/fields.py index ff71328f52..45b425efd6 100644 --- a/django/forms/fields.py +++ b/django/forms/fields.py @@ -236,10 +236,10 @@ class CharField(Field): def widget_attrs(self, widget): attrs = super(CharField, self).widget_attrs(widget) - if self.max_length is not None: + if self.max_length is not None and not widget.is_hidden: # The HTML attribute is maxlength, not max_length. attrs['maxlength'] = str(self.max_length) - if self.min_length is not None: + if self.min_length is not None and not widget.is_hidden: # The HTML attribute is minlength, not min_length. attrs['minlength'] = str(self.min_length) return attrs diff --git a/tests/forms_tests/field_tests/test_charfield.py b/tests/forms_tests/field_tests/test_charfield.py index 906b91bc75..a08a1a4e42 100644 --- a/tests/forms_tests/field_tests/test_charfield.py +++ b/tests/forms_tests/field_tests/test_charfield.py @@ -1,7 +1,7 @@ from __future__ import unicode_literals from django.forms import ( - CharField, PasswordInput, Textarea, TextInput, ValidationError, + CharField, HiddenInput, PasswordInput, Textarea, TextInput, ValidationError, ) from django.test import SimpleTestCase @@ -79,7 +79,9 @@ class CharFieldTest(FormFieldAssertionsMixin, SimpleTestCase): def test_charfield_widget_attrs(self): """ - CharField.widget_attrs() always returns a dictionary (#15912). + CharField.widget_attrs() always returns a dictionary and includes + minlength/maxlength if min_length/max_length are defined on the field + and the widget is not hidden. """ # Return an empty dictionary if max_length and min_length are both None. f = CharField() @@ -104,6 +106,7 @@ class CharFieldTest(FormFieldAssertionsMixin, SimpleTestCase): 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'}) + self.assertEqual(f.widget_attrs(HiddenInput()), {}) def test_charfield_strip(self): """