summaryrefslogtreecommitdiff
path: root/django
diff options
context:
space:
mode:
authorChris Jerdonek <chris.jerdonek@gmail.com>2021-07-13 05:22:26 -0400
committerCarlton Gibson <carlton.gibson@noumenal.es>2021-07-15 10:47:02 +0200
commit90a33ab2ceddef7f2cdd11612f77ea9296cc7fb9 (patch)
tree84e8089064f61aabcb522717834a1e17d5c17a39 /django
parent84400d2e9db7c51fee4e9bb04c028f665b8e7624 (diff)
Fixed #32920 -- Changed BaseForm to access its values through bound fields.
Diffstat (limited to 'django')
-rw-r--r--django/forms/forms.py32
1 files changed, 17 insertions, 15 deletions
diff --git a/django/forms/forms.py b/django/forms/forms.py
index d14037bfe9..40ed71ed5c 100644
--- a/django/forms/forms.py
+++ b/django/forms/forms.py
@@ -143,7 +143,13 @@ class BaseForm:
'fields': ';'.join(self.fields),
}
+ def _bound_items(self):
+ """Yield (name, bf) pairs, where bf is a BoundField object."""
+ for name in self.fields:
+ yield name, self[name]
+
def __iter__(self):
+ """Yield the form's fields as BoundField objects."""
for name in self.fields:
yield self[name]
@@ -206,9 +212,9 @@ class BaseForm:
top_errors = self.non_field_errors().copy()
output, hidden_fields = [], []
- for name, field in self.fields.items():
+ for name, bf in self._bound_items():
+ field = bf.field
html_class_attr = ''
- bf = self[name]
bf_errors = self.error_class(bf.errors)
if bf.is_hidden:
if bf_errors:
@@ -387,15 +393,12 @@ class BaseForm:
self._post_clean()
def _clean_fields(self):
- for name, field in self.fields.items():
- if field.disabled:
- value = self.get_initial_for_field(field, name)
- else:
- value = self._field_data_value(field, self.add_prefix(name))
+ for name, bf in self._bound_items():
+ field = bf.field
+ value = bf.initial if field.disabled else bf.data
try:
if isinstance(field, FileField):
- initial = self.get_initial_for_field(field, name)
- value = field.clean(value, initial)
+ value = field.clean(value, bf.initial)
else:
value = field.clean(value)
self.cleaned_data[name] = value
@@ -437,24 +440,23 @@ class BaseForm:
@cached_property
def changed_data(self):
data = []
- for name, field in self.fields.items():
- data_value = self._field_data_value(field, self.add_prefix(name))
+ for name, bf in self._bound_items():
+ field = bf.field
if not field.show_hidden_initial:
# Use the BoundField's initial as this is the value passed to
# the widget.
- initial_value = self[name].initial
+ initial_value = bf.initial
else:
- initial_prefixed_name = self.add_initial_prefix(name)
hidden_widget = field.hidden_widget()
try:
initial_value = field.to_python(
- self._widget_data_value(hidden_widget, initial_prefixed_name)
+ self._widget_data_value(hidden_widget, bf.html_initial_name)
)
except ValidationError:
# Always assume data has changed if validation fails.
data.append(name)
continue
- if field.has_changed(initial_value, data_value):
+ if field.has_changed(initial_value, bf.data):
data.append(name)
return data