Commit 14b16095 authored by Karen Tracey's avatar Karen Tracey
Browse files

Fixed #8962 -- Consistently support format and input_format in the various...

Fixed #8962 -- Consistently support format and input_format in the various (individual, combined, split) date and time form fields and widgets.

Many thanks to Tai Lee for doing all the work here.


git-svn-id: http://code.djangoproject.com/svn/django/trunk@10115 bcc190cf-cafb-0310-a4f2-bffc1f526a37
parent b203db6e
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -256,6 +256,7 @@ answer newbie questions, and generally made Django that much better:
    Eugene Lazutkin <http://lazutkin.com/blog/>
    lcordier@point45.com
    Jeong-Min Lee <falsetru@gmail.com>
    Tai Lee <real.human@mrmachine.net>
    Jannis Leidel <jl@websushi.org>
    Christopher Lenz <http://www.cmlenz.net/>
    lerouxb@gmail.com
@@ -295,7 +296,6 @@ answer newbie questions, and generally made Django that much better:
    Aljosa Mohorovic <aljosa.mohorovic@gmail.com>
    Ramiro Morales <rm0@gmx.net>
    Eric Moritz <http://eric.themoritzfamily.com/>
    mrmachine <real.human@mrmachine.net>
    Robin Munn <http://www.geekforgod.com/>
    James Murty
    msundstr
+10 −0
Original line number Diff line number Diff line
@@ -36,3 +36,13 @@ class DateTimeField(forms.DateTimeField):
    def __init__(self, input_formats=None, *args, **kwargs):
        input_formats = input_formats or DEFAULT_DATETIME_INPUT_FORMATS
        super(DateTimeField, self).__init__(input_formats=input_formats, *args, **kwargs)

class SplitDateTimeField(forms.SplitDateTimeField):
    """
    Split date and time input fields which use non-US date and time input
    formats by default.
    """
    def __init__(self, input_date_formats=None, input_time_formats=None, *args, **kwargs):
        input_date_formats = input_date_formats or DEFAULT_DATE_INPUT_FORMATS
        super(SplitDateTimeField, self).__init__(input_date_formats=input_date_formats,
                                                 input_time_formats=input_time_formats, *args, **kwargs)
+5 −4
Original line number Diff line number Diff line
@@ -28,7 +28,7 @@ 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, TimeInput, SplitDateTimeWidget, SplitHiddenDateTimeWidget
from widgets import TextInput, PasswordInput, HiddenInput, MultipleHiddenInput, FileInput, CheckboxInput, Select, NullBooleanSelect, SelectMultiple, DateInput, DateTimeInput, TimeInput, SplitDateTimeWidget, SplitHiddenDateTimeWidget
from django.core.files.uploadedfile import SimpleUploadedFile as UploadedFile

__all__ = (
@@ -283,6 +283,7 @@ DEFAULT_DATE_INPUT_FORMATS = (
)

class DateField(Field):
    widget = DateInput 
    default_error_messages = {
        'invalid': _(u'Enter a valid date.'),
    }
@@ -850,13 +851,13 @@ class SplitDateTimeField(MultiValueField):
        'invalid_time': _(u'Enter a valid time.'),
    }

    def __init__(self, *args, **kwargs):
    def __init__(self, input_date_formats=None, input_time_formats=None, *args, **kwargs):
        errors = self.default_error_messages.copy()
        if 'error_messages' in kwargs:
            errors.update(kwargs['error_messages'])
        fields = (
            DateField(error_messages={'invalid': errors['invalid_date']}),
            TimeField(error_messages={'invalid': errors['invalid_time']}),
            DateField(input_formats=input_date_formats, error_messages={'invalid': errors['invalid_date']}),
            TimeField(input_formats=input_time_formats, error_messages={'invalid': errors['invalid_time']}),
        )
        super(SplitDateTimeField, self).__init__(fields, *args, **kwargs)

+36 −6
Original line number Diff line number Diff line
@@ -23,7 +23,7 @@ from urlparse import urljoin
__all__ = (
    'Media', 'MediaDefiningClass', 'Widget', 'TextInput', 'PasswordInput',
    'HiddenInput', 'MultipleHiddenInput',
    'FileInput', 'DateTimeInput', 'TimeInput', 'Textarea', 'CheckboxInput',
    'FileInput', 'DateInput', 'DateTimeInput', 'TimeInput', 'Textarea', 'CheckboxInput',
    'Select', 'NullBooleanSelect', 'SelectMultiple', 'RadioSelect',
    'CheckboxSelectMultiple', 'MultiWidget',
    'SplitDateTimeWidget',
@@ -285,6 +285,23 @@ class Textarea(Widget):
        return mark_safe(u'<textarea%s>%s</textarea>' % (flatatt(final_attrs),
                conditional_escape(force_unicode(value))))

class DateInput(Input):
    input_type = 'text'
    format = '%Y-%m-%d'     # '2006-10-25'

    def __init__(self, attrs=None, format=None):
        super(DateInput, self).__init__(attrs)
        if format:
            self.format = format

    def render(self, name, value, attrs=None):
        if value is None:
            value = ''
        elif hasattr(value, 'strftime'):
            value = datetime_safe.new_date(value)
            value = value.strftime(self.format)
        return super(DateInput, self).render(name, value, attrs)

class DateTimeInput(Input):
    input_type = 'text'
    format = '%Y-%m-%d %H:%M:%S'     # '2006-10-25 14:30:59'
@@ -304,12 +321,18 @@ class DateTimeInput(Input):

class TimeInput(Input):
    input_type = 'text'
    format = '%H:%M:%S'     # '14:30:59'

    def __init__(self, attrs=None, format=None):
        super(TimeInput, self).__init__(attrs)
        if format:
            self.format = format

    def render(self, name, value, attrs=None):
        if value is None:
            value = ''
        elif isinstance(value, time):
            value = value.replace(microsecond=0)
        elif hasattr(value, 'strftime'):
            value = value.strftime(self.format)
        return super(TimeInput, self).render(name, value, attrs)

class CheckboxInput(Widget):
@@ -654,8 +677,16 @@ class SplitDateTimeWidget(MultiWidget):
    """
    A Widget that splits datetime input into two <input type="text"> boxes.
    """
    def __init__(self, attrs=None):
        widgets = (TextInput(attrs=attrs), TextInput(attrs=attrs))
    date_format = DateInput.format
    time_format = TimeInput.format

    def __init__(self, attrs=None, date_format=None, time_format=None):
        if date_format:
            self.date_format = date_format
        if time_format:
            self.time_format = time_format
        widgets = (DateInput(attrs=attrs, format=self.date_format),
                   TimeInput(attrs=attrs, format=self.time_format))
        super(SplitDateTimeWidget, self).__init__(widgets, attrs)

    def decompress(self, value):
@@ -670,4 +701,3 @@ class SplitHiddenDateTimeWidget(SplitDateTimeWidget):
    def __init__(self, attrs=None):
        widgets = (HiddenInput(attrs=attrs), HiddenInput(attrs=attrs))
        super(SplitDateTimeWidget, self).__init__(widgets, attrs)
+3 −3
Original line number Diff line number Diff line
@@ -66,9 +66,9 @@ Countries currently supported by :mod:`~django.contrib.localflavor` are:
    * `United States of America`_

The ``django.contrib.localflavor`` package also includes a ``generic`` subpackage,
containing useful code that is not specific to one particular country or
culture. Currently, it defines date and datetime input fields based on those
from :ref:`forms <topics-forms-index>`, but with non-US default formats.
containing useful code that is not specific to one particular country or culture.
Currently, it defines date, datetime and split datetime input fields based on
those from :ref:`forms <topics-forms-index>`, but with non-US default formats.
Here's an example of how to use them::

    from django import forms
Loading