diff options
| author | Tim Graham <timograham@gmail.com> | 2016-07-25 14:04:39 -0400 |
|---|---|---|
| committer | Tim Graham <timograham@gmail.com> | 2016-07-27 08:14:14 -0400 |
| commit | a5f85d891b51d7ceb4f9e422e3e4f5c741062288 (patch) | |
| tree | c12b7c8bb54fbb373105a0bd8e263ced612b0edf | |
| parent | 0d1218896f3dcd9a37d44c123d936e5fe8cea416 (diff) | |
Fixed #26917 -- Fixed crash in disabled ModelChoiceFields.
Partially reverted refs #25532 to fix a regression in Django 1.10.
This reintroduces a crash for disabled forms.JSONField (refs #26949),
however, that issue is also present on Django 1.9.
Thanks Ryan Schave for the test.
| -rw-r--r-- | django/forms/forms.py | 9 | ||||
| -rw-r--r-- | tests/model_forms/tests.py | 15 | ||||
| -rw-r--r-- | tests/postgres_tests/test_json.py | 8 |
3 files changed, 19 insertions, 13 deletions
diff --git a/django/forms/forms.py b/django/forms/forms.py index e2ed1a4ac1..25e081e324 100644 --- a/django/forms/forms.py +++ b/django/forms/forms.py @@ -373,14 +373,13 @@ class BaseForm(object): def _clean_fields(self): for name, field in self.fields.items(): - if field.disabled: - # Initial values are supposed to be clean - self.cleaned_data[name] = self.initial.get(name, field.initial) - continue # value_from_datadict() gets the data from the data dictionaries. # Each widget type knows how to retrieve its own data, because some # widgets split data over several HTML fields. - value = field.widget.value_from_datadict(self.data, self.files, self.add_prefix(name)) + if field.disabled: + value = self.initial.get(name, field.initial) + else: + value = field.widget.value_from_datadict(self.data, self.files, self.add_prefix(name)) try: if isinstance(field, FileField): initial = self.initial.get(name, field.initial) diff --git a/tests/model_forms/tests.py b/tests/model_forms/tests.py index 9de1a7f24b..daf36c8fc2 100644 --- a/tests/model_forms/tests.py +++ b/tests/model_forms/tests.py @@ -1519,6 +1519,21 @@ class ModelChoiceFieldTests(TestCase): '<label><input name="foo" type="radio" value="" /> ---------</label>' ) + def test_disabled_modelchoicefield(self): + class ModelChoiceForm(forms.ModelForm): + author = forms.ModelChoiceField(Author.objects.all(), disabled=True) + + class Meta: + model = Book + fields = ['author'] + + book = Book.objects.create(author=Writer.objects.create(name='Test writer')) + form = ModelChoiceForm({}, instance=book) + self.assertEqual( + form.errors['author'], + ['Select a valid choice. That choice is not one of the available choices.'] + ) + def test_modelchoicefield_iterator(self): """ Iterator defaults to ModelChoiceIterator and can be overridden with diff --git a/tests/postgres_tests/test_json.py b/tests/postgres_tests/test_json.py index b88d103761..0165cabfd9 100644 --- a/tests/postgres_tests/test_json.py +++ b/tests/postgres_tests/test_json.py @@ -260,14 +260,6 @@ class TestFormField(PostgreSQLTestCase): form_field = model_field.formfield() self.assertIsInstance(form_field, forms.JSONField) - def test_formfield_disabled(self): - class JsonForm(Form): - name = CharField() - jfield = forms.JSONField(disabled=True) - - form = JsonForm({'name': 'xyz', 'jfield': '["bar"]'}, initial={'jfield': ['foo']}) - self.assertIn('["foo"]</textarea>', form.as_p()) - def test_prepare_value(self): field = forms.JSONField() self.assertEqual(field.prepare_value({'a': 'b'}), '{"a": "b"}') |
