Index: django/newforms/widgets.py
===================================================================
--- django/newforms/widgets.py (revision 6373)
+++ django/newforms/widgets.py (working copy)
@@ -7,7 +7,10 @@
except NameError:
from sets import Set as set # Python 2.3 fallback
+import datetime
from itertools import chain
+from django.conf import settings
+from django.utils import dateformat
from django.utils.datastructures import MultiValueDict
from django.utils.html import escape
from django.utils.translation import ugettext
@@ -15,7 +18,7 @@
from util import flatatt
__all__ = (
- 'Widget', 'TextInput', 'PasswordInput',
+ 'Widget', 'TextInput', 'DateTextInput', 'TimeTextInput', 'PasswordInput',
'HiddenInput', 'MultipleHiddenInput',
'FileInput', 'Textarea', 'CheckboxInput',
'Select', 'NullBooleanSelect', 'SelectMultiple', 'RadioSelect',
@@ -84,6 +87,32 @@
class TextInput(Input):
input_type = 'text'
+class DateTextInput(TextInput):
+ """Renders value in text input using default or specified date format."""
+ def __init__(self, format=None, attrs=None):
+ super(DateTextInput, self).__init__(attrs)
+ self.format = format or settings.DATE_FORMAT
+
+ def render(self, name, value, attrs=None):
+ if value and (isinstance(value, datetime.date) or isinstance(value, datetime.datetime)):
+ formatted_value = dateformat.format(value, self.format)
+ else:
+ formatted_value = None
+ return super(DateTextInput, self).render(name, formatted_value, attrs)
+
+class TimeTextInput(TextInput):
+ """Renders time in text input using default or specified time format."""
+ def __init__(self, format=None, attrs=None):
+ super(TimeTextInput, self).__init__(attrs)
+ self.format = format or settings.TIME_FORMAT
+
+ def render(self, name, value, attrs=None):
+ if value and (isinstance(value, datetime.time) or isinstance(value, datetime.datetime)):
+ formatted_value = dateformat.time_format(value, self.format)
+ else:
+ formatted_value = None
+ return super(TimeTextInput, self).render(name, formatted_value, attrs)
+
class PasswordInput(Input):
input_type = 'password'
Index: tests/regressiontests/forms/tests.py
===================================================================
--- tests/regressiontests/forms/tests.py (revision 6373)
+++ tests/regressiontests/forms/tests.py (working copy)
@@ -53,6 +53,42 @@
>>> w.render('email', '', attrs={'class': 'special'})
u''
+# DateTextInput Widget ############################################################
+
+>>> w = DateTextInput(format='d F Y')
+>>> w.render('date', '')
+u''
+>>> w.render('date', 'bogus')
+u''
+>>> w.render('date', datetime.date(2007, 9, 1))
+u''
+>>> w.render('date', datetime.datetime(2007, 1, 9, 22, 11))
+u''
+>>> w = DateTextInput(format='N j, Y', attrs={'class': 'fun'})
+>>> w.render('date', datetime.date(2007, 9, 1))
+u''
+>>> w.render('date', datetime.datetime(2007, 1, 9, 11, 22))
+u''
+
+# TimeTextInput Widget ############################################################
+
+>>> w = TimeTextInput(format='H:i:s')
+>>> w.render('time', '')
+u''
+>>> w.render('time', 'bogus')
+u''
+>>> w.render('time', datetime.time(11, 22, 33))
+u''
+>>> w.render('time', datetime.time(21, 32))
+u''
+>>> w = TimeTextInput(format='P', attrs={'class': 'shiny'})
+>>> w.render('time', datetime.datetime(2007, 1, 9, 11, 22, 33))
+u''
+>>> w.render('time', datetime.datetime(2007, 1, 9, 21, 32))
+u''
+>>> w.render('time', datetime.datetime(2007, 1, 9))
+u''
+
# PasswordInput Widget ############################################################
>>> w = PasswordInput()