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'' """ +