diff --git a/django/forms/widgets.py b/django/forms/widgets.py index f401896b60e1..56ff7bb5add9 100644 --- a/django/forms/widgets.py +++ b/django/forms/widgets.py @@ -343,7 +343,14 @@ def format_value(self, value): """ Return a value as it should appear when rendered in a template. """ - if value == "" or value is None: + from django.db.models.expressions import DatabaseDefault + + if ( + value == "" + or value is None + # Empty value when db_default is used. + or isinstance(value, DatabaseDefault) + ): return None if self.is_localized: return formats.localize_input(value) diff --git a/tests/forms_tests/widget_tests/test_widget.py b/tests/forms_tests/widget_tests/test_widget.py index 9e243570d77a..32e5e38f59dd 100644 --- a/tests/forms_tests/widget_tests/test_widget.py +++ b/tests/forms_tests/widget_tests/test_widget.py @@ -1,3 +1,5 @@ +from django.db.models import Value +from django.db.models.expressions import DatabaseDefault from django.forms import Widget from django.forms.widgets import Input @@ -9,6 +11,7 @@ def test_format_value(self): widget = Widget() self.assertIsNone(widget.format_value(None)) self.assertIsNone(widget.format_value("")) + self.assertIsNone(widget.format_value(DatabaseDefault(Value("1")))) self.assertEqual(widget.format_value("español"), "español") self.assertEqual(widget.format_value(42.5), "42.5")