diff --git a/src/wuttaweb/forms/base.py b/src/wuttaweb/forms/base.py index b1e142a..796fd6f 100644 --- a/src/wuttaweb/forms/base.py +++ b/src/wuttaweb/forms/base.py @@ -1138,7 +1138,18 @@ class Form: # pylint: disable=too-many-instance-attributes,too-many-public-meth field = dform[fieldname] if readonly: kwargs["readonly"] = True - html = field.serialize(**kwargs) + + try: + html = field.serialize(**kwargs) + except Exception as exc: + log.warning( + "widget serialization failed for field: %s", + fieldname, + exc_info=True, + ) + raise RuntimeError( + f"widget serialization failed for field: {fieldname}" + ) from exc else: # render static text if field not in deform/schema diff --git a/tests/forms/test_base.py b/tests/forms/test_base.py index 804b360..63f807a 100644 --- a/tests/forms/test_base.py +++ b/tests/forms/test_base.py @@ -587,6 +587,14 @@ class TestForm(WebTestCase): html = form.render_vue_field("foo") self.assertIn("something is wrong", html) + class BadWidget(deform.widget.Widget): + def serialize(self, **kwargs): + raise NotImplementedError + + # widget serialization error + dform["foo"].widget = BadWidget() + self.assertRaises(RuntimeError, form.render_vue_field, "foo") + # add another field, but not to deform, so it should still # display but with no widget form.fields.append("zanzibar")