diff --git a/django/forms/forms.py b/django/forms/forms.py index b231de421a..fece2158ac 100644 --- a/django/forms/forms.py +++ b/django/forms/forms.py @@ -342,6 +342,8 @@ class BaseForm(object): data_value = field.widget.value_from_datadict(self.data, self.files, prefixed_name) if not field.show_hidden_initial: initial_value = self.initial.get(name, field.initial) + if callable(initial_value): + initial_value = initial_value() else: initial_prefixed_name = self.add_initial_prefix(name) hidden_widget = field.hidden_widget() diff --git a/tests/forms_tests/tests/test_formsets.py b/tests/forms_tests/tests/test_formsets.py index 767a900673..1e9e7db30c 100644 --- a/tests/forms_tests/tests/test_formsets.py +++ b/tests/forms_tests/tests/test_formsets.py @@ -1,8 +1,10 @@ # -*- coding: utf-8 -*- from __future__ import unicode_literals +import datetime + from django.forms import (CharField, DateField, FileField, Form, IntegerField, - ValidationError, formsets) + SplitDateTimeField, ValidationError, formsets) from django.forms.formsets import BaseFormSet, formset_factory from django.forms.util import ErrorList from django.test import TestCase @@ -45,6 +47,13 @@ FavoriteDrinksFormSet = formset_factory(FavoriteDrinkForm, formset=BaseFavoriteDrinksFormSet, extra=3) +# Used in ``test_formset_splitdatetimefield``. +class SplitDateTimeForm(Form): + when = SplitDateTimeField(initial=datetime.datetime.now) + +SplitDateTimeFormSet = formset_factory(SplitDateTimeForm) + + class FormsFormsetTestCase(TestCase): def test_basic_formset(self): # A FormSet constructor takes the same arguments as Form. Let's create a FormSet @@ -882,6 +891,19 @@ class FormsFormsetTestCase(TestCase): self.assertEqual(len(formset.forms), 0) self.assertTrue(formset) + def test_formset_splitdatetimefield(self): + """ + Formset should also work with SplitDateTimeField(initial=datetime.datetime.now). + Regression test for #18709. + """ + data = { + 'form-TOTAL_FORMS': '1', + 'form-INITIAL_FORMS': '0', + 'form-0-when_0': '1904-06-16', + 'form-0-when_1': '15:51:33', + } + formset = SplitDateTimeFormSet(data) + self.assertTrue(formset.is_valid()) def test_formset_error_class(self): # Regression tests for #16479 -- formsets form use ErrorList instead of supplied error_class