From 8a3ef1f8bce338b2ca255177b4ba6d020fd05bca Mon Sep 17 00:00:00 2001 From: Malcolm Tredinnick Date: Sat, 23 Aug 2008 17:33:09 +0000 Subject: [PATCH] Fixed #7499 -- Trim microseconds off rendering of form.TimeFields by default so that they validate. Previous code didn't work with microseconds anyway, so this is backwards compatible. Thanks to kevin for the patch. git-svn-id: http://code.djangoproject.com/svn/django/trunk@8491 bcc190cf-cafb-0310-a4f2-bffc1f526a37 --- django/forms/fields.py | 5 +++-- django/forms/widgets.py | 12 +++++++++++- tests/regressiontests/forms/widgets.py | 18 ++++++++++++++++++ 3 files changed, 32 insertions(+), 3 deletions(-) diff --git a/django/forms/fields.py b/django/forms/fields.py index 5537cf66f9..02c4c3db88 100644 --- a/django/forms/fields.py +++ b/django/forms/fields.py @@ -27,14 +27,14 @@ from django.utils.translation import ugettext_lazy as _ from django.utils.encoding import smart_unicode, smart_str from util import ErrorList, ValidationError -from widgets import TextInput, PasswordInput, HiddenInput, MultipleHiddenInput, FileInput, CheckboxInput, Select, NullBooleanSelect, SelectMultiple, DateTimeInput +from widgets import TextInput, PasswordInput, HiddenInput, MultipleHiddenInput, FileInput, CheckboxInput, Select, NullBooleanSelect, SelectMultiple, DateTimeInput, TimeInput from django.core.files.uploadedfile import SimpleUploadedFile as UploadedFile __all__ = ( 'Field', 'CharField', 'IntegerField', 'DEFAULT_DATE_INPUT_FORMATS', 'DateField', 'DEFAULT_TIME_INPUT_FORMATS', 'TimeField', - 'DEFAULT_DATETIME_INPUT_FORMATS', 'DateTimeField', + 'DEFAULT_DATETIME_INPUT_FORMATS', 'DateTimeField', 'TimeField', 'RegexField', 'EmailField', 'FileField', 'ImageField', 'URLField', 'BooleanField', 'NullBooleanField', 'ChoiceField', 'MultipleChoiceField', 'ComboField', 'MultiValueField', 'FloatField', 'DecimalField', @@ -311,6 +311,7 @@ DEFAULT_TIME_INPUT_FORMATS = ( ) class TimeField(Field): + widget = TimeInput() default_error_messages = { 'invalid': _(u'Enter a valid time.') } diff --git a/django/forms/widgets.py b/django/forms/widgets.py index 4dd0601d69..0d6c5bcbbc 100644 --- a/django/forms/widgets.py +++ b/django/forms/widgets.py @@ -22,7 +22,7 @@ from urlparse import urljoin __all__ = ( 'Media', 'MediaDefiningClass', 'Widget', 'TextInput', 'PasswordInput', 'HiddenInput', 'MultipleHiddenInput', - 'FileInput', 'DateTimeInput', 'Textarea', 'CheckboxInput', + 'FileInput', 'DateTimeInput', 'TimeInput', 'Textarea', 'CheckboxInput', 'Select', 'NullBooleanSelect', 'SelectMultiple', 'RadioSelect', 'CheckboxSelectMultiple', 'MultiWidget', 'SplitDateTimeWidget', ) @@ -301,6 +301,16 @@ class DateTimeInput(Input): value = value.strftime(self.format) return super(DateTimeInput, self).render(name, value, attrs) +class TimeInput(Input): + input_type = 'text' + + def render(self, name, value, attrs=None): + if value is None: + value = '' + elif hasattr(value, 'replace'): + value = value.replace(microsecond=0) + return super(TimeInput, self).render(name, value, attrs) + class CheckboxInput(Widget): def __init__(self, attrs=None, check_test=bool): super(CheckboxInput, self).__init__(attrs) diff --git a/tests/regressiontests/forms/widgets.py b/tests/regressiontests/forms/widgets.py index 40c4d01793..e0d9f42db5 100644 --- a/tests/regressiontests/forms/widgets.py +++ b/tests/regressiontests/forms/widgets.py @@ -1087,4 +1087,22 @@ u'' u'' >>> w.render('date', datetime.datetime(2007, 9, 17, 12, 51)) u'' + +# TimeInput ############################################################### + +>>> w = TimeInput() +>>> w.render('time', None) +u'' +>>> t = datetime.time(12, 51, 34, 482548) +>>> print t +12:51:34.482548 + +The microseconds are trimmed on display, by default. +>>> w.render('time', t) +u'' +>>> w.render('time', datetime.time(12, 51, 34)) +u'' +>>> w.render('time', datetime.time(12, 51)) +u'' """ +