diff options
| author | Claude Paroz <claude@2xlibre.net> | 2014-03-13 16:55:38 +0100 |
|---|---|---|
| committer | Claude Paroz <claude@2xlibre.net> | 2014-03-13 16:59:23 +0100 |
| commit | 1a2939bc26b7077e3196cea9bce52826ec7a6d9d (patch) | |
| tree | 830b645242eaebdfb6cabe058b4b9bd7ce6ab510 | |
| parent | 141bb90b4c66cca1c4bfafe2a0e5c5777c55c61c (diff) | |
[1.6.x] Fixed #22245 -- Avoided widget overwrite in forms.IntegerField subclasses
Thanks Jeroen Pulles for the report and Simon Charette for the review.
Backport of 5a976b4bec7 from master.
| -rw-r--r-- | django/forms/fields.py | 5 | ||||
| -rw-r--r-- | docs/releases/1.6.3.txt | 5 | ||||
| -rw-r--r-- | tests/forms_tests/tests/test_fields.py | 12 |
3 files changed, 21 insertions, 1 deletions
diff --git a/django/forms/fields.py b/django/forms/fields.py index c94a5641c4..966b303ead 100644 --- a/django/forms/fields.py +++ b/django/forms/fields.py @@ -216,13 +216,16 @@ class CharField(Field): class IntegerField(Field): + widget = NumberInput default_error_messages = { 'invalid': _('Enter a whole number.'), } def __init__(self, max_value=None, min_value=None, *args, **kwargs): self.max_value, self.min_value = max_value, min_value - kwargs.setdefault('widget', NumberInput if not kwargs.get('localize') else self.widget) + if kwargs.get('localize') and self.widget == NumberInput: + # Localized number input is not well supported on most browsers + kwargs.setdefault('widget', super(IntegerField, self).widget) super(IntegerField, self).__init__(*args, **kwargs) if max_value is not None: diff --git a/docs/releases/1.6.3.txt b/docs/releases/1.6.3.txt index a8b63dc72a..004e70f663 100644 --- a/docs/releases/1.6.3.txt +++ b/docs/releases/1.6.3.txt @@ -18,3 +18,8 @@ several bugs in 1.6.2: * Fixed crash of ``QuerySet``\s that use ``F() + timedelta()`` when their query was compiled more once (`#21643 <http://code.djangoproject.com/ticket/21643>`_). + +* Prevented custom ``widget`` class attribute of + :class:`~django.forms.IntegerField` subclasses from being overwritten by the + code in their ``__init__`` method + (`#22245 <http://code.djangoproject.com/ticket/22245>`_). diff --git a/tests/forms_tests/tests/test_fields.py b/tests/forms_tests/tests/test_fields.py index f02593e488..262ec5d9f6 100644 --- a/tests/forms_tests/tests/test_fields.py +++ b/tests/forms_tests/tests/test_fields.py @@ -234,6 +234,18 @@ class FieldsTests(SimpleTestCase): f1 = IntegerField(localize=True) self.assertWidgetRendersTo(f1, '<input id="id_f" name="f" type="text" />') + def test_integerfield_subclass(self): + """ + Test that class-defined widget is not overwritten by __init__ (#22245). + """ + class MyIntegerField(IntegerField): + widget = Textarea + + f = MyIntegerField() + self.assertEqual(f.widget.__class__, Textarea) + f = MyIntegerField(localize=True) + self.assertEqual(f.widget.__class__, Textarea) + # FloatField ################################################################## def test_floatfield_1(self): |
