summaryrefslogtreecommitdiff
path: root/django/forms/fields.py
diff options
context:
space:
mode:
Diffstat (limited to 'django/forms/fields.py')
-rw-r--r--django/forms/fields.py61
1 files changed, 28 insertions, 33 deletions
diff --git a/django/forms/fields.py b/django/forms/fields.py
index c0ee2f0955..a4904d452d 100644
--- a/django/forms/fields.py
+++ b/django/forms/fields.py
@@ -7,6 +7,7 @@ import os
import re
import time
import urlparse
+import warnings
from decimal import Decimal, DecimalException
try:
from cStringIO import StringIO
@@ -17,6 +18,7 @@ import django.core.exceptions
import django.utils.copycompat as copy
from django.utils.translation import ugettext_lazy as _
from django.utils.encoding import smart_unicode, smart_str
+from django.utils.formats import get_format
from util import ErrorList, ValidationError
from widgets import TextInput, PasswordInput, HiddenInput, MultipleHiddenInput, FileInput, CheckboxInput, Select, NullBooleanSelect, SelectMultiple, DateInput, DateTimeInput, TimeInput, SplitDateTimeWidget, SplitHiddenDateTimeWidget
@@ -36,6 +38,20 @@ __all__ = (
# These values, if given to to_python(), will trigger the self.required check.
EMPTY_VALUES = (None, '')
+def en_format(name):
+ """
+ Helper function to stay backward compatible.
+ """
+ from django.conf.locale.en import formats
+ warnings.warn(
+ "`django.forms.fields.DEFAULT_%s` is deprecated; use `django.utils.formats.get_format('%s')` instead." % (name, name),
+ PendingDeprecationWarning
+ )
+ return getattr(formats, name)
+
+DEFAULT_DATE_INPUT_FORMATS = en_format('DATE_INPUT_FORMATS')
+DEFAULT_TIME_INPUT_FORMATS = en_format('TIME_INPUT_FORMATS')
+DEFAULT_DATETIME_INPUT_FORMATS = en_format('DATETIME_INPUT_FORMATS')
class Field(object):
widget = TextInput # Default widget to use when rendering this type of Field.
@@ -200,7 +216,9 @@ class FloatField(Field):
if not self.required and value in EMPTY_VALUES:
return None
try:
- value = float(value)
+ # We always accept dot as decimal separator
+ if isinstance(value, str) or isinstance(value, unicode):
+ value = float(value.replace(get_format('DECIMAL_SEPARATOR'), '.'))
except (ValueError, TypeError):
raise ValidationError(self.error_messages['invalid'])
if self.max_value is not None and value > self.max_value:
@@ -236,7 +254,9 @@ class DecimalField(Field):
return None
value = smart_str(value).strip()
try:
- value = Decimal(value)
+ # We always accept dot as decimal separator
+ if isinstance(value, str) or isinstance(value, unicode):
+ value = Decimal(value.replace(get_format('DECIMAL_SEPARATOR'), '.'))
except DecimalException:
raise ValidationError(self.error_messages['invalid'])
@@ -264,14 +284,6 @@ class DecimalField(Field):
raise ValidationError(self.error_messages['max_whole_digits'] % (self.max_digits - self.decimal_places))
return value
-DEFAULT_DATE_INPUT_FORMATS = (
- '%Y-%m-%d', '%m/%d/%Y', '%m/%d/%y', # '2006-10-25', '10/25/2006', '10/25/06'
- '%b %d %Y', '%b %d, %Y', # 'Oct 25 2006', 'Oct 25, 2006'
- '%d %b %Y', '%d %b, %Y', # '25 Oct 2006', '25 Oct, 2006'
- '%B %d %Y', '%B %d, %Y', # 'October 25 2006', 'October 25, 2006'
- '%d %B %Y', '%d %B, %Y', # '25 October 2006', '25 October, 2006'
-)
-
class DateField(Field):
widget = DateInput
default_error_messages = {
@@ -280,7 +292,7 @@ class DateField(Field):
def __init__(self, input_formats=None, *args, **kwargs):
super(DateField, self).__init__(*args, **kwargs)
- self.input_formats = input_formats or DEFAULT_DATE_INPUT_FORMATS
+ self.input_formats = input_formats
def clean(self, value):
"""
@@ -294,18 +306,13 @@ class DateField(Field):
return value.date()
if isinstance(value, datetime.date):
return value
- for format in self.input_formats:
+ for format in self.input_formats or get_format('DATE_INPUT_FORMATS'):
try:
return datetime.date(*time.strptime(value, format)[:3])
except ValueError:
continue
raise ValidationError(self.error_messages['invalid'])
-DEFAULT_TIME_INPUT_FORMATS = (
- '%H:%M:%S', # '14:30:59'
- '%H:%M', # '14:30'
-)
-
class TimeField(Field):
widget = TimeInput
default_error_messages = {
@@ -314,7 +321,7 @@ class TimeField(Field):
def __init__(self, input_formats=None, *args, **kwargs):
super(TimeField, self).__init__(*args, **kwargs)
- self.input_formats = input_formats or DEFAULT_TIME_INPUT_FORMATS
+ self.input_formats = input_formats
def clean(self, value):
"""
@@ -326,25 +333,13 @@ class TimeField(Field):
return None
if isinstance(value, datetime.time):
return value
- for format in self.input_formats:
+ for format in self.input_formats or get_format('TIME_INPUT_FORMATS'):
try:
return datetime.time(*time.strptime(value, format)[3:6])
except ValueError:
continue
raise ValidationError(self.error_messages['invalid'])
-DEFAULT_DATETIME_INPUT_FORMATS = (
- '%Y-%m-%d %H:%M:%S', # '2006-10-25 14:30:59'
- '%Y-%m-%d %H:%M', # '2006-10-25 14:30'
- '%Y-%m-%d', # '2006-10-25'
- '%m/%d/%Y %H:%M:%S', # '10/25/2006 14:30:59'
- '%m/%d/%Y %H:%M', # '10/25/2006 14:30'
- '%m/%d/%Y', # '10/25/2006'
- '%m/%d/%y %H:%M:%S', # '10/25/06 14:30:59'
- '%m/%d/%y %H:%M', # '10/25/06 14:30'
- '%m/%d/%y', # '10/25/06'
-)
-
class DateTimeField(Field):
widget = DateTimeInput
default_error_messages = {
@@ -353,7 +348,7 @@ class DateTimeField(Field):
def __init__(self, input_formats=None, *args, **kwargs):
super(DateTimeField, self).__init__(*args, **kwargs)
- self.input_formats = input_formats or DEFAULT_DATETIME_INPUT_FORMATS
+ self.input_formats = input_formats
def clean(self, value):
"""
@@ -373,7 +368,7 @@ class DateTimeField(Field):
if len(value) != 2:
raise ValidationError(self.error_messages['invalid'])
value = '%s %s' % tuple(value)
- for format in self.input_formats:
+ for format in self.input_formats or get_format('DATETIME_INPUT_FORMATS'):
try:
return datetime.datetime(*time.strptime(value, format)[:6])
except ValueError: