Skip to content

Commit 29e41f1

Browse files
committed
Fixed #5363 -- HTML5 datetime-local valid format HTMLFormRenderer
1 parent 853969c commit 29e41f1

File tree

2 files changed

+23
-1
lines changed

2 files changed

+23
-1
lines changed

rest_framework/renderers.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -343,7 +343,11 @@ def render_field(self, field, parent_style):
343343
field = field.as_form_field()
344344

345345
if style.get('input_type') == 'datetime-local' and isinstance(field.value, str):
346-
field.value = field.value.rstrip('Z')
346+
# The format of an input type="datetime-local" is "yyyy-MM-ddThh:mm"
347+
# followed by optional ":ss" or ":ss.SSS", so keep only the first three
348+
# digits of milliseconds to avoid browser console error.
349+
datetime_parts = field.value.split(".")
350+
field.value = f"{datetime_parts[0]}.{datetime_parts[1][:3]}"
347351

348352
if 'template' in style:
349353
template_name = style['template']

tests/test_renderers.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import re
22
from collections.abc import MutableMapping
3+
from datetime import datetime
34

45
import pytest
56
from django.core.cache import cache
@@ -488,6 +489,23 @@ class TestSerializer(serializers.Serializer):
488489
assert rendered == ''
489490

490491

492+
class TestDateTimeFieldHTMLFormRender(TestCase):
493+
def test_datetime_field_rendering(self):
494+
class TestSerializer(serializers.Serializer):
495+
appointment = serializers.DateTimeField()
496+
497+
appointment = datetime(2024, 12, 24, 00, 55, 30, 345678)
498+
serializer = TestSerializer(data={"appointment": appointment})
499+
serializer.is_valid()
500+
renderer = HTMLFormRenderer()
501+
field = serializer['appointment']
502+
rendered = renderer.render_field(field, {})
503+
self.assertInHTML(
504+
'<input name="appointment" class="form-control" type="datetime-local" value="2024-12-24T00:55:30.345">',
505+
rendered
506+
)
507+
508+
491509
class TestHTMLFormRenderer(TestCase):
492510
def setUp(self):
493511
class TestSerializer(serializers.Serializer):

0 commit comments

Comments
 (0)