Index: django/newforms/widgets.py
===================================================================
--- django/newforms/widgets.py (revision 4546)
+++ django/newforms/widgets.py (working copy)
@@ -4,7 +4,7 @@
__all__ = (
'Widget', 'TextInput', 'PasswordInput', 'HiddenInput', 'MultipleHiddenInput',
- 'FileInput', 'Textarea', 'CheckboxInput',
+ 'FileInput', 'Textarea', 'CheckboxInput', 'DateOrTimeTextInput',
'Select', 'NullBooleanSelect', 'SelectMultiple', 'RadioSelect', 'CheckboxSelectMultiple',
'MultiWidget', 'SplitDateTimeWidget',
)
@@ -14,6 +14,7 @@
from django.utils.html import escape
from django.utils.translation import gettext
from itertools import chain
+from datetime import date, datetime, time
try:
set # Only available in Python 2.4+
@@ -116,6 +117,19 @@
class FileInput(Input):
input_type = 'file'
+class DateOrTimeTextInput(TextInput):
+ """
+ A widget that renders date, datetime and time values using a specific format.
+ """
+ def __init__(self, attrs=None, format='%Y-%m-%d'):
+ self.format = format
+ super(DateOrTimeTextInput, self).__init__(attrs)
+
+ def render(self, name, value, attrs=None):
+ if isinstance(value, (date, datetime, time)):
+ value = value.strftime(self.format)
+ return super(DateOrTimeTextInput, self).render(name, value, attrs)
+
class Textarea(Widget):
def render(self, name, value, attrs=None):
if value is None: value = ''
@@ -343,8 +357,9 @@
"""
A Widget that splits datetime input into two boxes.
"""
- def __init__(self, attrs=None):
- widgets = (TextInput(attrs=attrs), TextInput(attrs=attrs))
+ def __init__(self, attrs=None, date_format='%Y-%m-%d', time_format='%H:%M:%S'):
+ widgets = (DateOrTimeTextInput(attrs=attrs, format=date_format),
+ DateOrTimeTextInput(attrs=attrs, format=time_format))
super(SplitDateTimeWidget, self).__init__(widgets, attrs)
def decompress(self, value):
Index: tests/regressiontests/forms/tests.py
===================================================================
--- tests/regressiontests/forms/tests.py (revision 4546)
+++ tests/regressiontests/forms/tests.py (working copy)
@@ -186,6 +186,36 @@
>>> w.render('email', 'ŠĐĆŽćžšđ', attrs={'class': 'fun'})
u''
+# DateOrTimeTextInput Widget ##################################################
+
+>>> test_time = datetime.datetime(2006, 1, 10, 13, 30)
+
+>>> w = DateOrTimeTextInput()
+>>> w.render('date', None)
+u''
+>>> w.render('date', 'non-date')
+u''
+
+Defaults to %Y-%m-%d
+>>> w.render('date', test_time)
+u''
+
+Pass 'format' attribute to change the strftime when rendering.
+>>> w = DateOrTimeTextInput(format='%m/%d/%Y')
+>>> w.render('date', test_time)
+u''
+>>> w = DateOrTimeTextInput(format='%H:%M:%S')
+>>> w.render('time', test_time)
+u''
+
+Works with time and date objects too
+>>> w = DateOrTimeTextInput(format='%H:%M:%S')
+>>> w.render('time', test_time.time())
+u''
+>>> w = DateOrTimeTextInput(format='%m/%d/%Y')
+>>> w.render('date', test_time.date())
+u''
+
# Textarea Widget #############################################################
>>> w = Textarea()
@@ -787,6 +817,11 @@
>>> w.render('date', datetime.datetime(2006, 1, 10, 7, 30))
u''
+You can also pass 'date_format' and 'time_format' to change the strftime format for the date and time.
+>>> w = SplitDateTimeWidget(date_format='%m/%d/%Y', time_format='%#I:%M %p')
+>>> w.render('date', datetime.datetime(2006, 1, 10, 7, 30))
+u''
+
##########
# Fields #
##########