Skip to content

Commit c967a6f

Browse files
committed
Fixed #5363 -- HTML5 datetime-local valid format HTMLFormRenderer
1 parent 085b7e1 commit c967a6f

File tree

2 files changed

+22
-1
lines changed

2 files changed

+22
-1
lines changed

rest_framework/renderers.py

+4-1
Original file line numberDiff line numberDiff line change
@@ -338,7 +338,10 @@ def render_field(self, field, parent_style):
338338
field = field.as_form_field()
339339

340340
if style.get('input_type') == 'datetime-local' and isinstance(field.value, str):
341-
field.value = field.value.rstrip('Z')
341+
# The format of an input type="datetime-local" is "yyyy-MM-ddThh:mm"
342+
# followed by optional ":ss" or ":ss.SSS", so remove [milli|micro]seconds
343+
# to avoid browser error.
344+
field.value = "".join(field.value.rstrip('Z').split(".")[:1])
342345

343346
if 'template' in style:
344347
template_name = style['template']

tests/test_renderers.py

+18
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">',
505+
rendered
506+
)
507+
508+
491509
class TestHTMLFormRenderer(TestCase):
492510
def setUp(self):
493511
class TestSerializer(serializers.Serializer):

0 commit comments

Comments
 (0)