summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--django/forms/forms.py9
-rw-r--r--tests/model_forms/tests.py15
-rw-r--r--tests/postgres_tests/test_json.py8
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 2f96fcec30..e18b19dcac 100644
--- a/tests/model_forms/tests.py
+++ b/tests/model_forms/tests.py
@@ -1499,6 +1499,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.']
+ )
+
class ModelMultipleChoiceFieldTests(TestCase):
def setUp(self):
diff --git a/tests/postgres_tests/test_json.py b/tests/postgres_tests/test_json.py
index 1978552cf9..d4f0a9bb57 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('[&quot;foo&quot;]</textarea>', form.as_p())
-
def test_prepare_value(self):
field = forms.JSONField()
self.assertEqual(field.prepare_value({'a': 'b'}), '{"a": "b"}')