From dce278673a409a10c1f74f597035b737bbf6a017 Mon Sep 17 00:00:00 2001 From: Andrew Godwin Date: Thu, 9 Jun 2011 17:03:45 +0000 Subject: [PATCH] Fixed #9459: forms.HiddenInput and DateTime field loses microseconds. Thanks to mt. git-svn-id: http://code.djangoproject.com/svn/django/trunk@16347 bcc190cf-cafb-0310-a4f2-bffc1f526a37 --- django/conf/global_settings.py | 3 +++ django/forms/fields.py | 12 ++++++++++-- tests/regressiontests/forms/tests/fields.py | 3 +++ 3 files changed, 16 insertions(+), 2 deletions(-) diff --git a/django/conf/global_settings.py b/django/conf/global_settings.py index 1300e86caa..ab31c15da3 100644 --- a/django/conf/global_settings.py +++ b/django/conf/global_settings.py @@ -366,12 +366,15 @@ TIME_INPUT_FORMATS = ( # * Note that these format strings are different from the ones to display dates DATETIME_INPUT_FORMATS = ( '%Y-%m-%d %H:%M:%S', # '2006-10-25 14:30:59' + '%Y-%m-%d %H:%M:%S.%f', # '2006-10-25 14:30:59.000200' '%Y-%m-%d %H:%M', # '2006-10-25 14:30' '%Y-%m-%d', # '2006-10-25' '%m/%d/%Y %H:%M:%S', # '10/25/2006 14:30:59' + '%m/%d/%Y %H:%M:%S.%f', # '10/25/2006 14:30:59.000200' '%m/%d/%Y %H:%M', # '10/25/2006 14:30' '%m/%d/%Y', # '10/25/2006' '%m/%d/%y %H:%M:%S', # '10/25/06 14:30:59' + '%m/%d/%y %H:%M:%S.%f', # '10/25/06 14:30:59.000200' '%m/%d/%y %H:%M', # '10/25/06 14:30' '%m/%d/%y', # '10/25/06' ) diff --git a/django/forms/fields.py b/django/forms/fields.py index a5ea81d4b6..dd23b12e5c 100644 --- a/django/forms/fields.py +++ b/django/forms/fields.py @@ -338,7 +338,15 @@ class BaseTemporalField(Field): try: return self.strptime(value, format) except ValueError: - continue + if format.endswith('.%f'): + if not value.count('.')==1: + continue + try: + datetime_str, usecs_str = value.rsplit('.', 1) + usecs = int(usecs_str) + return datetime.datetime(*time.strptime(datetime_str, format[:-3])[:6]+(usecs,)) + except ValueError: + continue raise ValidationError(self.error_messages['invalid']) def strptime(self, value, format): @@ -417,7 +425,7 @@ class DateTimeField(BaseTemporalField): return super(DateTimeField, self).to_python(value) def strptime(self, value, format): - return datetime.datetime(*time.strptime(value, format)[:6]) + return datetime.datetime.strptime(value, format) class RegexField(CharField): def __init__(self, regex, max_length=None, min_length=None, error_message=None, *args, **kwargs): diff --git a/tests/regressiontests/forms/tests/fields.py b/tests/regressiontests/forms/tests/fields.py index 2303b4e9db..ad8d1d92d9 100644 --- a/tests/regressiontests/forms/tests/fields.py +++ b/tests/regressiontests/forms/tests/fields.py @@ -379,14 +379,17 @@ class FieldsTests(TestCase): self.assertEqual(datetime.datetime(2006, 10, 25, 14, 30), f.clean(datetime.datetime(2006, 10, 25, 14, 30))) self.assertEqual(datetime.datetime(2006, 10, 25, 14, 30, 59), f.clean(datetime.datetime(2006, 10, 25, 14, 30, 59))) self.assertEqual(datetime.datetime(2006, 10, 25, 14, 30, 59, 200), f.clean(datetime.datetime(2006, 10, 25, 14, 30, 59, 200))) + self.assertEqual(datetime.datetime(2006, 10, 25, 14, 30, 45, 200), f.clean('2006-10-25 14:30:45.000200')) self.assertEqual(datetime.datetime(2006, 10, 25, 14, 30, 45), f.clean('2006-10-25 14:30:45')) self.assertEqual(datetime.datetime(2006, 10, 25, 14, 30), f.clean('2006-10-25 14:30:00')) self.assertEqual(datetime.datetime(2006, 10, 25, 14, 30), f.clean('2006-10-25 14:30')) self.assertEqual(datetime.datetime(2006, 10, 25, 0, 0), f.clean('2006-10-25')) + self.assertEqual(datetime.datetime(2006, 10, 25, 14, 30, 45, 200), f.clean('10/25/2006 14:30:45.000200')) self.assertEqual(datetime.datetime(2006, 10, 25, 14, 30, 45), f.clean('10/25/2006 14:30:45')) self.assertEqual(datetime.datetime(2006, 10, 25, 14, 30), f.clean('10/25/2006 14:30:00')) self.assertEqual(datetime.datetime(2006, 10, 25, 14, 30), f.clean('10/25/2006 14:30')) self.assertEqual(datetime.datetime(2006, 10, 25, 0, 0), f.clean('10/25/2006')) + self.assertEqual(datetime.datetime(2006, 10, 25, 14, 30, 45, 200), f.clean('10/25/06 14:30:45.000200')) self.assertEqual(datetime.datetime(2006, 10, 25, 14, 30, 45), f.clean('10/25/06 14:30:45')) self.assertEqual(datetime.datetime(2006, 10, 25, 14, 30), f.clean('10/25/06 14:30:00')) self.assertEqual(datetime.datetime(2006, 10, 25, 14, 30), f.clean('10/25/06 14:30'))