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
This commit is contained in:
Malcolm Tredinnick 2008-08-23 17:33:09 +00:00
parent 646f2f6101
commit 8a3ef1f8bc
3 changed files with 32 additions and 3 deletions

View File

@ -27,14 +27,14 @@ from django.utils.translation import ugettext_lazy as _
from django.utils.encoding import smart_unicode, smart_str from django.utils.encoding import smart_unicode, smart_str
from util import ErrorList, ValidationError 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 from django.core.files.uploadedfile import SimpleUploadedFile as UploadedFile
__all__ = ( __all__ = (
'Field', 'CharField', 'IntegerField', 'Field', 'CharField', 'IntegerField',
'DEFAULT_DATE_INPUT_FORMATS', 'DateField', 'DEFAULT_DATE_INPUT_FORMATS', 'DateField',
'DEFAULT_TIME_INPUT_FORMATS', 'TimeField', 'DEFAULT_TIME_INPUT_FORMATS', 'TimeField',
'DEFAULT_DATETIME_INPUT_FORMATS', 'DateTimeField', 'DEFAULT_DATETIME_INPUT_FORMATS', 'DateTimeField', 'TimeField',
'RegexField', 'EmailField', 'FileField', 'ImageField', 'URLField', 'RegexField', 'EmailField', 'FileField', 'ImageField', 'URLField',
'BooleanField', 'NullBooleanField', 'ChoiceField', 'MultipleChoiceField', 'BooleanField', 'NullBooleanField', 'ChoiceField', 'MultipleChoiceField',
'ComboField', 'MultiValueField', 'FloatField', 'DecimalField', 'ComboField', 'MultiValueField', 'FloatField', 'DecimalField',
@ -311,6 +311,7 @@ DEFAULT_TIME_INPUT_FORMATS = (
) )
class TimeField(Field): class TimeField(Field):
widget = TimeInput()
default_error_messages = { default_error_messages = {
'invalid': _(u'Enter a valid time.') 'invalid': _(u'Enter a valid time.')
} }

View File

@ -22,7 +22,7 @@ from urlparse import urljoin
__all__ = ( __all__ = (
'Media', 'MediaDefiningClass', 'Widget', 'TextInput', 'PasswordInput', 'Media', 'MediaDefiningClass', 'Widget', 'TextInput', 'PasswordInput',
'HiddenInput', 'MultipleHiddenInput', 'HiddenInput', 'MultipleHiddenInput',
'FileInput', 'DateTimeInput', 'Textarea', 'CheckboxInput', 'FileInput', 'DateTimeInput', 'TimeInput', 'Textarea', 'CheckboxInput',
'Select', 'NullBooleanSelect', 'SelectMultiple', 'RadioSelect', 'Select', 'NullBooleanSelect', 'SelectMultiple', 'RadioSelect',
'CheckboxSelectMultiple', 'MultiWidget', 'SplitDateTimeWidget', 'CheckboxSelectMultiple', 'MultiWidget', 'SplitDateTimeWidget',
) )
@ -301,6 +301,16 @@ class DateTimeInput(Input):
value = value.strftime(self.format) value = value.strftime(self.format)
return super(DateTimeInput, self).render(name, value, attrs) 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): class CheckboxInput(Widget):
def __init__(self, attrs=None, check_test=bool): def __init__(self, attrs=None, check_test=bool):
super(CheckboxInput, self).__init__(attrs) super(CheckboxInput, self).__init__(attrs)

View File

@ -1087,4 +1087,22 @@ u'<input type="text" name="date" value="2007-09-17 12:51:34" />'
u'<input type="text" name="date" value="2007-09-17 12:51:34" />' u'<input type="text" name="date" value="2007-09-17 12:51:34" />'
>>> w.render('date', datetime.datetime(2007, 9, 17, 12, 51)) >>> w.render('date', datetime.datetime(2007, 9, 17, 12, 51))
u'<input type="text" name="date" value="2007-09-17 12:51:00" />' u'<input type="text" name="date" value="2007-09-17 12:51:00" />'
# TimeInput ###############################################################
>>> w = TimeInput()
>>> w.render('time', None)
u'<input type="text" name="time" />'
>>> 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'<input type="text" name="time" value="12:51:34" />'
>>> w.render('time', datetime.time(12, 51, 34))
u'<input type="text" name="time" value="12:51:34" />'
>>> w.render('time', datetime.time(12, 51))
u'<input type="text" name="time" value="12:51:00" />'
""" """