diff --git a/rest_framework/renderers.py b/rest_framework/renderers.py index c471e1f84..4f3fce0ab 100644 --- a/rest_framework/renderers.py +++ b/rest_framework/renderers.py @@ -347,7 +347,10 @@ class HTMLFormRenderer(BaseRenderer): # followed by optional ":ss" or ":ss.SSS", so keep only the first three # digits of milliseconds to avoid browser console error. datetime_parts = field.value.split(".") - field.value = f"{datetime_parts[0]}.{datetime_parts[1][:3]}" + if len(datetime_parts) > 1: + field.value = f"{datetime_parts[0]}.{datetime_parts[1][:3]}" + else: + field.value = field.value.rstrip('Z') if 'template' in style: template_name = style['template'] diff --git a/tests/test_renderers.py b/tests/test_renderers.py index e76908e7e..d723f90c2 100644 --- a/tests/test_renderers.py +++ b/tests/test_renderers.py @@ -489,8 +489,9 @@ class TestHiddenFieldHTMLFormRenderer(TestCase): assert rendered == '' +@override_settings(TIME_ZONE='UTC', USE_TZ=True) class TestDateTimeFieldHTMLFormRender(TestCase): - def test_datetime_field_rendering(self): + def test_datetime_field_rendering_milliseconds(self): class TestSerializer(serializers.Serializer): appointment = serializers.DateTimeField() @@ -505,6 +506,36 @@ class TestDateTimeFieldHTMLFormRender(TestCase): rendered ) + def test_datetime_field_rendering_no_milliseconds(self): + class TestSerializer(serializers.Serializer): + appointment = serializers.DateTimeField() + + appointment = datetime(2024, 12, 24, 0, 55, 30, 0) + serializer = TestSerializer(data={"appointment": appointment}) + serializer.is_valid() + renderer = HTMLFormRenderer() + field = serializer['appointment'] + rendered = renderer.render_field(field, {}) + self.assertInHTML( + '', + rendered + ) + + def test_datetime_field_rendering_no_seconds_and_milliseconds(self): + class TestSerializer(serializers.Serializer): + appointment = serializers.DateTimeField() + + appointment = datetime(2024, 12, 24, 0, 55, 0, 0) + serializer = TestSerializer(data={"appointment": appointment}) + serializer.is_valid() + renderer = HTMLFormRenderer() + field = serializer['appointment'] + rendered = renderer.render_field(field, {}) + self.assertInHTML( + '', + rendered + ) + class TestHTMLFormRenderer(TestCase): def setUp(self):