diff --git a/django/forms/widgets.py b/django/forms/widgets.py
index c2bc534e5a..67108e450b 100644
--- a/django/forms/widgets.py
+++ b/django/forms/widgets.py
@@ -463,7 +463,9 @@ class DateTimeBaseInput(TextInput):
self.format = format if format else None
def format_value(self, value):
- return formats.localize_input(value, self.format or formats.get_format(self.format_key)[0])
+ if value is not None:
+ # localize_input() returns str on Python 2.
+ return force_text(formats.localize_input(value, self.format or formats.get_format(self.format_key)[0]))
class DateInput(DateTimeBaseInput):
diff --git a/docs/releases/1.11.4.txt b/docs/releases/1.11.4.txt
index 9834d703a2..28f06deb06 100644
--- a/docs/releases/1.11.4.txt
+++ b/docs/releases/1.11.4.txt
@@ -9,4 +9,6 @@ Django 1.11.4 fixes several bugs in 1.11.3.
Bugfixes
========
-* ...
+* Fixed a regression in 1.11.3 on Python 2 where non-ASCII ``format`` values
+ for date/time widgets results in an empty ``value`` in the widget's HTML
+ (:ticket:`28355`).
diff --git a/tests/forms_tests/widget_tests/test_timeinput.py b/tests/forms_tests/widget_tests/test_timeinput.py
index 96fb04e24c..1b63eeddc0 100644
--- a/tests/forms_tests/widget_tests/test_timeinput.py
+++ b/tests/forms_tests/widget_tests/test_timeinput.py
@@ -1,4 +1,9 @@
+# -*- encoding: utf-8 -*-
+from __future__ import unicode_literals
+
+import sys
from datetime import time
+from unittest import skipIf
from django.forms import TimeInput
from django.test import override_settings
@@ -43,6 +48,12 @@ class TimeInputTest(WidgetTest):
widget = TimeInput(format='%H:%M', attrs={'type': 'time'})
self.check_html(widget, 'time', t, html='')
+ # Test fails on Windows due to http://bugs.python.org/issue8304#msg222667
+ @skipIf(sys.platform.startswith('win'), 'Fails with UnicodeEncodeError error on Windows.')
+ def test_non_ascii_format(self):
+ widget = TimeInput(format='τ-%H:%M')
+ self.check_html(widget, 'time', time(10, 10), '')
+
@override_settings(USE_L10N=True)
@translation.override('de-at')
def test_l10n(self):