diff options
| author | Jon Dufresne <jon.dufresne@gmail.com> | 2016-08-18 17:55:47 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2016-08-18 17:55:47 -0700 |
| commit | f5c6d3c8d9fa2158734858fa0a7ac917c384cb97 (patch) | |
| tree | 0f3846b3df6a78c674d3ef048235d5604d469186 /django/forms/forms.py | |
| parent | 13857b45ca54a519a58361238442af84262c0d23 (diff) | |
Fixed #27068 -- Unified form field initial data retrieval.
Diffstat (limited to 'django/forms/forms.py')
| -rw-r--r-- | django/forms/forms.py | 20 |
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." |
