summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorClaude Paroz <claude@2xlibre.net>2013-12-06 14:40:51 +0100
committerClaude Paroz <claude@2xlibre.net>2013-12-07 10:21:05 +0100
commit34c4b93c84e86665d66d0b31da8e30fd581d5b5f (patch)
tree18455e7a4978c7c06aa74fbbd85b501080a851aa
parent7d75a33331c971194bd07143aa8ff4b491f5c693 (diff)
[1.6.x] Fixed #21568 -- Added missing ModelMultipleChoiceField to_python method
Thanks dibrovsd at gmail.com for the report and Simon Charette for the review. Backport of 8a9c8bb90 from master.
-rw-r--r--django/forms/models.py6
-rw-r--r--docs/releases/1.6.1.txt3
-rw-r--r--tests/model_forms_regress/tests.py23
3 files changed, 32 insertions, 0 deletions
diff --git a/django/forms/models.py b/django/forms/models.py
index 5c4fe4bbdf..15c0015b89 100644
--- a/django/forms/models.py
+++ b/django/forms/models.py
@@ -1167,6 +1167,12 @@ class ModelMultipleChoiceField(ModelChoiceField):
msg = _('Hold down "Control", or "Command" on a Mac, to select more than one.')
self.help_text = string_concat(self.help_text, ' ', msg)
+ def to_python(self, value):
+ if not value:
+ return []
+ to_py = super(ModelMultipleChoiceField, self).to_python
+ return [to_py(val) for val in value]
+
def clean(self, value):
if self.required and not value:
raise ValidationError(self.error_messages['required'], code='required')
diff --git a/docs/releases/1.6.1.txt b/docs/releases/1.6.1.txt
index 5eeb446b88..2ac8822c9c 100644
--- a/docs/releases/1.6.1.txt
+++ b/docs/releases/1.6.1.txt
@@ -22,6 +22,9 @@ Bug fixes
raised an error (#21439).
* Fixed a regression that prevented editable ``GenericRelation`` subclasses
from working in ``ModelForms``.
+* Added missing ``to_python`` method for ``ModelMultipleChoiceField`` which
+ is required in Django 1.6 to properly detect changes from initial values
+ (#21568).
* Fixed ``django.contrib.humanize`` translations where the unicode sequence
for the non-breaking space was returned verbatim (#21415).
* Fixed :djadmin:`loaddata` error when fixture file name contained any dots
diff --git a/tests/model_forms_regress/tests.py b/tests/model_forms_regress/tests.py
index 39ae857219..57faad38e5 100644
--- a/tests/model_forms_regress/tests.py
+++ b/tests/model_forms_regress/tests.py
@@ -44,6 +44,29 @@ class ModelMultipleChoiceFieldTests(TestCase):
f.clean([p.pk for p in Person.objects.all()[8:9]])
self.assertTrue(self._validator_run)
+ def test_model_multiple_choice_show_hidden_initial(self):
+ """
+ Test support of show_hidden_initial by ModelMultipleChoiceField.
+ """
+ class PersonForm(forms.Form):
+ persons = forms.ModelMultipleChoiceField(show_hidden_initial=True,
+ queryset=Person.objects.all())
+
+ person1 = Person.objects.create(name="Person 1")
+ person2 = Person.objects.create(name="Person 2")
+
+ form = PersonForm(initial={'persons': [person1, person2]},
+ data={'initial-persons': [str(person1.pk), str(person2.pk)],
+ 'persons': [str(person1.pk), str(person2.pk)]})
+ self.assertTrue(form.is_valid())
+ self.assertFalse(form.has_changed())
+
+ form = PersonForm(initial={'persons': [person1, person2]},
+ data={'initial-persons': [str(person1.pk), str(person2.pk)],
+ 'persons': [str(person2.pk)]})
+ self.assertTrue(form.is_valid())
+ self.assertTrue(form.has_changed())
+
class TripleForm(forms.ModelForm):
class Meta: