diff --git a/django/contrib/admin/widgets.py b/django/contrib/admin/widgets.py
index d10c9c1..1d321d0 100644
--- a/django/contrib/admin/widgets.py
+++ b/django/contrib/admin/widgets.py
@@ -44,7 +44,7 @@ class FilteredSelectMultiple(forms.SelectMultiple):
             (name, self.verbose_name.replace('"', '\\"'), int(self.is_stacked), settings.ADMIN_MEDIA_PREFIX))
         return mark_safe(u''.join(output))
 
-class AdminDateWidget(forms.DateTimeInput):
+class AdminDateWidget(forms.DateInput):
     class Media:
         js = (settings.ADMIN_MEDIA_PREFIX + "js/calendar.js",
               settings.ADMIN_MEDIA_PREFIX + "js/admin/DateTimeShortcuts.js")
diff --git a/django/forms/fields.py b/django/forms/fields.py
index 14152c8..0bae4ba 100644
--- a/django/forms/fields.py
+++ b/django/forms/fields.py
@@ -105,6 +105,8 @@ class Field(object):
 
         # Trigger the localization machinery if needed.
         self.localize = localize
+        if self.localize:
+            widget.is_localized = True
 
         # Hook into self.widget_attrs() for any Field-specific HTML attributes.
         extra_attrs = self.widget_attrs(widget)
@@ -125,9 +127,6 @@ class Field(object):
 
         self.validators = self.default_validators + validators
 
-    def localize_value(self, value):
-        return formats.localize_input(value)
-
     def to_python(self, value):
         return value
 
@@ -843,9 +842,14 @@ class SplitDateTimeField(MultiValueField):
         errors = self.default_error_messages.copy()
         if 'error_messages' in kwargs:
             errors.update(kwargs['error_messages'])
+        localize = kwargs.get('localize', False)
         fields = (
-            DateField(input_formats=input_date_formats, error_messages={'invalid': errors['invalid_date']}),
-            TimeField(input_formats=input_time_formats, error_messages={'invalid': errors['invalid_time']}),
+            DateField(input_formats=input_date_formats,
+                      error_messages={'invalid': errors['invalid_date']},
+                      localize=localize),
+            TimeField(input_formats=input_time_formats,
+                      error_messages={'invalid': errors['invalid_time']},
+                      localize=localize),
         )
         super(SplitDateTimeField, self).__init__(fields, *args, **kwargs)
 
diff --git a/django/forms/forms.py b/django/forms/forms.py
index 6076065..b3718ef 100644
--- a/django/forms/forms.py
+++ b/django/forms/forms.py
@@ -443,8 +443,6 @@ class BoundField(StrAndUnicode):
             name = self.html_name
         else:
             name = self.html_initial_name
-        if self.field.localize:
-            data = self.field.localize_value(data)
         return widget.render(name, data, attrs=attrs)
 
     def as_text(self, attrs=None, **kwargs):
diff --git a/django/forms/widgets.py b/django/forms/widgets.py
index 73d0f89..a9b52aa 100644
--- a/django/forms/widgets.py
+++ b/django/forms/widgets.py
@@ -10,7 +10,7 @@ from django.utils.html import escape, conditional_escape
 from django.utils.translation import ugettext
 from django.utils.encoding import StrAndUnicode, force_unicode
 from django.utils.safestring import mark_safe
-from django.utils import formats
+from django.utils import datetime_safe, formats
 import time
 import datetime
 from util import flatatt
@@ -133,6 +133,7 @@ class Widget(object):
     __metaclass__ = MediaDefiningClass
     is_hidden = False          # Determines whether this corresponds to an <input type="hidden">.
     needs_multipart_form = False # Determines does this widget need multipart-encrypted form
+    is_localized = False
 
     def __init__(self, attrs=None):
         if attrs is not None:
@@ -209,10 +210,13 @@ class Input(Widget):
     input_type = None # Subclasses must define this.
 
     def render(self, name, value, attrs=None):
-        if value is None: value = ''
+        if value is None:
+            value = ''
         final_attrs = self.build_attrs(attrs, type=self.input_type, name=name)
         if value != '':
             # Only add the 'value' attribute if a value is non-empty.
+            if self.is_localized:
+                value = formats.localize_input(value)
             final_attrs['value'] = force_unicode(value)
         return mark_safe(u'<input%s />' % flatatt(final_attrs))
 
@@ -295,7 +299,7 @@ class Textarea(Widget):
 
 class DateInput(Input):
     input_type = 'text'
-    format = None
+    format = '%Y-%m-%d'     # '2006-10-25'
 
     def __init__(self, attrs=None, format=None):
         super(DateInput, self).__init__(attrs)
@@ -305,8 +309,11 @@ class DateInput(Input):
     def _format_value(self, value):
         if value is None:
             return ''
+        elif self.is_localized:
+            return value
         elif hasattr(value, 'strftime'):
-            return formats.localize_input(value, self.format)
+            value = datetime_safe.new_date(value)
+            return value.strftime(self.format)
         return value
 
     def render(self, name, value, attrs=None):
@@ -326,7 +333,7 @@ class DateInput(Input):
 
 class DateTimeInput(Input):
     input_type = 'text'
-    format = None
+    format = '%Y-%m-%d %H:%M:%S'     # '2006-10-25 14:30:59'
 
     def __init__(self, attrs=None, format=None):
         super(DateTimeInput, self).__init__(attrs)
@@ -336,8 +343,11 @@ class DateTimeInput(Input):
     def _format_value(self, value):
         if value is None:
             return ''
+        elif self.is_localized:
+            return value
         elif hasattr(value, 'strftime'):
-            return formats.localize_input(value, self.format)
+            value = datetime_safe.new_datetime(value)
+            return value.strftime(self.format)
         return value
 
     def render(self, name, value, attrs=None):
@@ -357,7 +367,7 @@ class DateTimeInput(Input):
 
 class TimeInput(Input):
     input_type = 'text'
-    format = None
+    format = '%H:%M:%S'     # '14:30:59'
 
     def __init__(self, attrs=None, format=None):
         super(TimeInput, self).__init__(attrs)
@@ -367,8 +377,10 @@ class TimeInput(Input):
     def _format_value(self, value):
         if value is None:
             return ''
+        elif self.is_localized:
+            return value
         elif hasattr(value, 'strftime'):
-            return formats.localize_input(value, self.format)
+            return value.strftime(self.format)
         return value
 
     def render(self, name, value, attrs=None):
@@ -674,6 +686,9 @@ class MultiWidget(Widget):
         super(MultiWidget, self).__init__(attrs)
 
     def render(self, name, value, attrs=None):
+        if self.is_localized:
+            for widget in self.widgets:
+                widget.is_localized = self.is_localized
         # value is a list of values, each corresponding to a widget
         # in self.widgets.
         if not isinstance(value, list):
diff --git a/tests/regressiontests/admin_widgets/models.py b/tests/regressiontests/admin_widgets/models.py
index 5632548..59d625b 100644
--- a/tests/regressiontests/admin_widgets/models.py
+++ b/tests/regressiontests/admin_widgets/models.py
@@ -105,6 +105,7 @@ HTML escaped.
 <p class="datetime">Date: <input value="2007-12-01" type="text" class="vDateField" name="test_0" size="10" /><br />Time: <input value="09:30:00" type="text" class="vTimeField" name="test_1" size="8" /></p>
 >>> activate('de-at')
 >>> settings.USE_L10N = True
+>>> w.is_localized = True
 >>> print conditional_escape(w.render('test', datetime(2007, 12, 1, 9, 30)))
 <p class="datetime">Datum: <input value="01.12.2007" type="text" class="vDateField" name="test_0" size="10" /><br />Zeit: <input value="09:30:00" type="text" class="vTimeField" name="test_1" size="8" /></p>
 >>> deactivate()
diff --git a/tests/regressiontests/forms/widgets.py b/tests/regressiontests/forms/widgets.py
index 0b2cceb..39d7d56 100644
--- a/tests/regressiontests/forms/widgets.py
+++ b/tests/regressiontests/forms/widgets.py
@@ -1135,6 +1135,7 @@ 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:00" />'
 >>> activate('de-at')
 >>> settings.USE_L10N = True
+>>> w.is_localized = True
 >>> w.render('date', d)
 u'<input type="text" name="date" value="17.09.2007 12:51:34" />'
 >>> deactivate()
@@ -1176,6 +1177,7 @@ u'<input type="text" name="date" value="2007-09-17" />'
 
 >>> activate('de-at')
 >>> settings.USE_L10N = True
+>>> w.is_localized = True
 >>> w.render('date', d)
 u'<input type="text" name="date" value="17.09.2007" />'
 >>> deactivate()
@@ -1220,6 +1222,7 @@ u'<input type="text" name="time" value="13:12:11" />'
 
 >>> activate('de-at')
 >>> settings.USE_L10N = True
+>>> w.is_localized = True
 >>> w.render('date', d)
 u'<input type="text" name="date" value="17.09.2007" />'
 >>> deactivate()
@@ -1259,6 +1262,7 @@ u'<input type="hidden" name="date_0" value="2007-09-17" /><input type="hidden" n
 u'<input type="hidden" name="date_0" value="2007-09-17" /><input type="hidden" name="date_1" value="12:51:00" />'
 >>> activate('de-at')
 >>> settings.USE_L10N = True
+>>> w.is_localized = True
 >>> w.render('date', datetime.datetime(2007, 9, 17, 12, 51))
 u'<input type="hidden" name="date_0" value="17.09.2007" /><input type="hidden" name="date_1" value="12:51:00" />'
 >>> deactivate()
diff --git a/tests/regressiontests/i18n/forms.py b/tests/regressiontests/i18n/forms.py
index 216d1fe..156441c 100644
--- a/tests/regressiontests/i18n/forms.py
+++ b/tests/regressiontests/i18n/forms.py
@@ -16,6 +16,7 @@ class SelectDateForm(forms.Form):
 class CompanyForm(forms.ModelForm):
     cents_payed = forms.DecimalField(max_digits=4, decimal_places=2, localize=True)
     products_delivered = forms.IntegerField(localize=True)
+    date_added = forms.DateTimeField(localize=True)
 
     class Meta:
         model = Company
