Index: django/db/models/fields/__init__.py
===================================================================
--- django/db/models/fields/__init__.py	(revisión: 8640)
+++ django/db/models/fields/__init__.py	(copia de trabajo)
@@ -231,7 +231,7 @@
 
     def get_default(self):
         "Returns the default value for this field."
-        if self.default is not NOT_PROVIDED:
+        if self.has_default():
             if callable(self.default):
                 return self.default()
             return force_unicode(self.default, strings_only=True)
@@ -308,6 +308,8 @@
             defaults['widget'] = forms.Select(choices=self.get_choices(include_blank=self.blank or not (self.has_default() or 'initial' in kwargs)))
         if self.has_default():
             defaults['initial'] = self.get_default()
+            if callable(self.default):
+                defaults['show_hidden_initial'] = True
         defaults.update(kwargs)
         return form_class(**defaults)
 
Index: django/forms/fields.py
===================================================================
--- django/forms/fields.py	(revisión: 8640)
+++ django/forms/fields.py	(copia de trabajo)
@@ -27,7 +27,7 @@
 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
+from widgets import TextInput, PasswordInput, HiddenInput, MultipleHiddenInput, FileInput, CheckboxInput, Select, NullBooleanSelect, SelectMultiple, DateTimeInput, TimeInput, SplitHiddenDateTimeWidget
 from django.core.files.uploadedfile import SimpleUploadedFile as UploadedFile
 
 __all__ = (
@@ -57,7 +57,7 @@
     creation_counter = 0
 
     def __init__(self, required=True, widget=None, label=None, initial=None,
-                 help_text=None, error_messages=None):
+                 help_text=None, error_messages=None, show_hidden_initial=False):
         # required -- Boolean that specifies whether the field is required.
         #             True by default.
         # widget -- A Widget class, or instance of a Widget class, that should
@@ -71,9 +71,12 @@
         # initial -- A value to use in this Field's initial display. This value
         #            is *not* used as a fallback if data isn't given.
         # help_text -- An optional string to use as "help text" for this Field.
+        # show_hidden_initial -- Boolean that specifies if is needed to render a
+        #                        hidden widget with initial value after widget.
         if label is not None:
             label = smart_unicode(label)
         self.required, self.label, self.initial = required, label, initial
+        self.show_hidden_initial = show_hidden_initial
         if help_text is None:
             self.help_text = u''
         else:
@@ -800,6 +803,7 @@
         self.widget.choices = self.choices
 
 class SplitDateTimeField(MultiValueField):
+    hidden_widget = SplitHiddenDateTimeWidget
     default_error_messages = {
         'invalid_date': _(u'Enter a valid date.'),
         'invalid_time': _(u'Enter a valid time.'),
Index: django/forms/forms.py
===================================================================
--- django/forms/forms.py	(revisión: 8640)
+++ django/forms/forms.py	(copia de trabajo)
@@ -128,6 +128,12 @@
         """
         return self.prefix and ('%s-%s' % (self.prefix, field_name)) or field_name
 
+    def add_initial_prefix(self, field_name):
+        """
+        Add a 'initial' prefix for checking dynamic initial values
+        """
+        return u'initial-%s' % self.add_prefix(field_name)
+
     def _html_output(self, normal_row, error_row, row_ender, help_text_html, errors_on_separate_row):
         "Helper function for outputting HTML. Used by as_table(), as_ul(), as_p()."
         top_errors = self.non_field_errors() # Errors that should be displayed above all fields.
@@ -245,7 +251,7 @@
         Returns True if data differs from initial.
         """
         return bool(self.changed_data)
-    
+
     def _get_changed_data(self):
         if self._changed_data is None:
             self._changed_data = []
@@ -258,7 +264,13 @@
             for name, field in self.fields.items():
                 prefixed_name = self.add_prefix(name)
                 data_value = field.widget.value_from_datadict(self.data, self.files, prefixed_name)
-                initial_value = self.initial.get(name, field.initial)
+                if not field.show_hidden_initial:
+                    initial_value = self.initial.get(name, field.initial)
+                else:
+                    initial_prefixed_name = self.add_initial_prefix(name)
+                    raw_initial_value = field.hidden_widget().value_from_datadict(self.data,
+                            self.files, initial_prefixed_name)
+                    initial_value = field.clean(raw_initial_value)
                 if field.widget._has_changed(initial_value, data_value):
                     self._changed_data.append(name)
         return self._changed_data
@@ -300,6 +312,7 @@
         self.field = field
         self.name = name
         self.html_name = form.add_prefix(name)
+        self.html_check_name = form.add_initial_prefix(name)
         if self.field.label is None:
             self.label = pretty_name(name)
         else:
@@ -336,7 +349,10 @@
                 data = data()
         else:
             data = self.data
-        return widget.render(self.html_name, data, attrs=attrs)
+        field_html = widget.render(self.html_name, data, attrs=attrs)
+        if self.field.show_hidden_initial:
+            field_html += self.field.hidden_widget().render(self.html_check_name, data)
+        return field_html
 
     def as_text(self, attrs=None):
         """
Index: django/forms/widgets.py
===================================================================
--- django/forms/widgets.py	(revisión: 8640)
+++ django/forms/widgets.py	(copia de trabajo)
@@ -25,7 +25,8 @@
     'HiddenInput', 'MultipleHiddenInput',
     'FileInput', 'DateTimeInput', 'TimeInput', 'Textarea', 'CheckboxInput',
     'Select', 'NullBooleanSelect', 'SelectMultiple', 'RadioSelect',
-    'CheckboxSelectMultiple', 'MultiWidget', 'SplitDateTimeWidget',
+    'CheckboxSelectMultiple', 'MultiWidget',
+    'SplitDateTimeWidget', 'SplitHiddenDateTimeWidget',
 )
 
 MEDIA_TYPES = ('css','js')
@@ -662,3 +663,12 @@
             return [value.date(), value.time().replace(microsecond=0)]
         return [None, None]
 
+class SplitHiddenDateTimeWidget(SplitDateTimeWidget):
+    """
+    A Widget that splits datetime input into two <input type="hidden"> inputs.
+    """
+    def __init__(self, attrs=None):
+        widgets = (HiddenInput(attrs=attrs), HiddenInput(attrs=attrs))
+        super(SplitDateTimeWidget, self).__init__(widgets, attrs)
+
+
