diff --git a/django/forms/widgets.py b/django/forms/widgets.py
index 1ac64ac6b9..bfc4cb25d1 100644
--- a/django/forms/widgets.py
+++ b/django/forms/widgets.py
@@ -295,14 +295,21 @@ class DateTimeInput(Input):
if format:
self.format = format
- def render(self, name, value, attrs=None):
+ def _format_value(self, value):
if value is None:
- value = ''
+ return ''
elif hasattr(value, 'strftime'):
value = datetime_safe.new_datetime(value)
- value = value.strftime(self.format)
+ return value.strftime(self.format)
+ return value
+
+ def render(self, name, value, attrs=None):
+ value = self._format_value(value)
return super(DateTimeInput, self).render(name, value, attrs)
+ def _has_changed(self, initial, data):
+ return super(DateTimeInput, self)._has_changed(self._format_value(initial), data)
+
class TimeInput(Input):
input_type = 'text'
@@ -400,11 +407,11 @@ class NullBooleanSelect(Select):
def value_from_datadict(self, data, files, name):
value = data.get(name, None)
- return {u'2': True,
- True: True,
- 'True': True,
- u'3': False,
- 'False': False,
+ return {u'2': True,
+ True: True,
+ 'True': True,
+ u'3': False,
+ 'False': False,
False: False}.get(value, None)
def _has_changed(self, initial, data):
diff --git a/tests/regressiontests/forms/widgets.py b/tests/regressiontests/forms/widgets.py
index 51b3356bed..8f03cff271 100644
--- a/tests/regressiontests/forms/widgets.py
+++ b/tests/regressiontests/forms/widgets.py
@@ -1071,9 +1071,9 @@ included on both widgets.
>>> w.render('date', datetime.datetime(2006, 1, 10, 7, 30))
u''
->>> w._has_changed(datetime.datetime(2008, 5, 5, 12, 40, 00), [u'2008-05-05', u'12:40:00'])
+>>> w._has_changed(datetime.datetime(2008, 5, 6, 12, 40, 00), [u'2008-05-06', u'12:40:00'])
False
->>> w._has_changed(datetime.datetime(2008, 5, 5, 12, 40, 00), [u'2008-05-05', u'12:41:00'])
+>>> w._has_changed(datetime.datetime(2008, 5, 6, 12, 40, 00), [u'2008-05-06', u'12:41:00'])
True
# DateTimeInput ###############################################################
@@ -1093,6 +1093,13 @@ u''
>>> w.render('date', datetime.datetime(2007, 9, 17, 12, 51))
u''
+Use 'format' to change the way a value is displayed.
+>>> w = DateTimeInput(format='%d/%m/%Y %H:%M')
+>>> w.render('date', d)
+u''
+>>> w._has_changed(d, '17/09/2007 12:51')
+False
+
# TimeInput ###################################################################
>>> w = TimeInput()