diff --git a/django_mongodb_backend/forms/fields/embedded_model.py b/django_mongodb_backend/forms/fields/embedded_model.py index 55200818..bbfa9c02 100644 --- a/django_mongodb_backend/forms/fields/embedded_model.py +++ b/django_mongodb_backend/forms/fields/embedded_model.py @@ -70,3 +70,12 @@ def bound_data(self, data, initial): return initial # Transform the bound data into a model instance. return self.compress(data) + + def prepare_value(self, value): + # When rendering a form with errors, nested EmbeddedModelField data + # won't be compressed if MultiValueField.clean() raises ValidationError + # error before compress() is called. The data must be compressed here + # so that EmbeddedModelBoundField.value() returns a model instance + # (rather than a list) for initializing the form in + # EmbeddedModelBoundField.__str__(). + return self.compress(value) if isinstance(value, list) else value diff --git a/tests/model_forms_/test_embedded_model.py b/tests/model_forms_/test_embedded_model.py index f5386585..4447b59f 100644 --- a/tests/model_forms_/test_embedded_model.py +++ b/tests/model_forms_/test_embedded_model.py @@ -173,6 +173,53 @@ def test_some_missing_data(self): form = BookForm(data, instance=book) self.assertFalse(form.is_valid()) self.assertEqual(form.errors["publisher"], ["Enter all required values."]) + self.assertHTMLEqual( + str(form), + """ +
+ + +
+
+
+ Publisher: + +
+ + +
+
+
+ Address: +
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+
+
+
""", + ) def test_invalid_field_data(self): """A field's data (state) is too long.""" @@ -196,6 +243,53 @@ def test_invalid_field_data(self): form.errors["publisher"], ["Ensure this value has at most 2 characters (it has 8)."], ) + self.assertHTMLEqual( + str(form), + """ +
+ + +
+
+
+ Publisher: + +
+ + +
+
+
+ Address: +
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+
+
+
""", + ) def test_all_missing_data(self): """An embedded model with all data missing triggers a required error."""