summaryrefslogtreecommitdiff
path: root/django/forms/forms.py
diff options
context:
space:
mode:
authorJon Dufresne <jon.dufresne@gmail.com>2016-08-18 17:55:47 -0700
committerGitHub <noreply@github.com>2016-08-18 17:55:47 -0700
commitf5c6d3c8d9fa2158734858fa0a7ac917c384cb97 (patch)
tree0f3846b3df6a78c674d3ef048235d5604d469186 /django/forms/forms.py
parent13857b45ca54a519a58361238442af84262c0d23 (diff)
Fixed #27068 -- Unified form field initial data retrieval.
Diffstat (limited to 'django/forms/forms.py')
-rw-r--r--django/forms/forms.py20
1 files changed, 15 insertions, 5 deletions
diff --git a/django/forms/forms.py b/django/forms/forms.py
index 25e081e324..17d4598f4c 100644
--- a/django/forms/forms.py
+++ b/django/forms/forms.py
@@ -377,12 +377,12 @@ class BaseForm(object):
# Each widget type knows how to retrieve its own data, because some
# widgets split data over several HTML fields.
if field.disabled:
- value = self.initial.get(name, field.initial)
+ value = self.get_initial_for_field(field, name)
else:
value = field.widget.value_from_datadict(self.data, self.files, self.add_prefix(name))
try:
if isinstance(field, FileField):
- initial = self.initial.get(name, field.initial)
+ initial = self.get_initial_for_field(field, name)
value = field.clean(value, initial)
else:
value = field.clean(value)
@@ -431,9 +431,9 @@ class BaseForm(object):
prefixed_name = self.add_prefix(name)
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()
+ # Use the BoundField's initial as this is the value passed to
+ # the widget.
+ initial_value = self[name].initial
else:
initial_prefixed_name = self.add_initial_prefix(name)
hidden_widget = field.hidden_widget()
@@ -482,6 +482,16 @@ class BaseForm(object):
"""
return [field for field in self if not field.is_hidden]
+ def get_initial_for_field(self, field, field_name):
+ """
+ Return initial data for field on form. Use initial data from the form
+ or the field, in that order. Evaluate callable values.
+ """
+ value = self.initial.get(field_name, field.initial)
+ if callable(value):
+ value = value()
+ return value
+
class Form(six.with_metaclass(DeclarativeFieldsMetaclass, BaseForm)):
"A collection of Fields, plus their associated data."