From 17d214a9821542696b4b632b1fc70086ed2f7ecc Mon Sep 17 00:00:00 2001 From: Russell Keith-Magee Date: Wed, 13 May 2009 14:31:39 +0000 Subject: [PATCH] [1.0.X] Fixed #10288 -- Corrected _has_changed handling of DateTimeInput when a custom date/time format is in use. Thanks to Koen Biermans for the report and patch. Merge of r10641 from trunk. git-svn-id: http://code.djangoproject.com/svn/django/branches/releases/1.0.X@10757 bcc190cf-cafb-0310-a4f2-bffc1f526a37 --- django/forms/widgets.py | 23 +++++++++++++++-------- tests/regressiontests/forms/widgets.py | 11 +++++++++-- 2 files changed, 24 insertions(+), 10 deletions(-) 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()