fix for NestedBoundField. When nested field uses custom to_representation and to_internal_value, then self.value of NestedBoundField can be direct object, not a dict. For example, to_representation can convert an object to a string.

This commit is contained in:
emakarov 2017-03-10 17:10:23 +03:00
parent 928f7cb40f
commit 43b45f9b6c

View File

@ -100,19 +100,25 @@ class NestedBoundField(BoundField):
def __getitem__(self, key): def __getitem__(self, key):
field = self.fields[key] field = self.fields[key]
if isinstance(self.value, dict):
value = self.value.get(key) if self.value else None value = self.value.get(key) if self.value else None
else:
value = self.value if self.value else None
error = self.errors.get(key) if self.errors else None error = self.errors.get(key) if self.errors else None
if hasattr(field, 'fields'): if hasattr(field, 'fields'):
return NestedBoundField(field, value, error, prefix=self.name + '.') return NestedBoundField(field, value, error, prefix=self.name + '.')
return BoundField(field, value, error, prefix=self.name + '.') return BoundField(field, value, error, prefix=self.name + '.')
def as_form_field(self): def as_form_field(self):
if isinstance(self.value, dict):
values = {} values = {}
for key, value in self.value.items(): for key, value in self.value.items():
if isinstance(value, (list, dict)): if isinstance(value, (list, dict)):
values[key] = value values[key] = value
else: else:
values[key] = '' if (value is None or value is False) else force_text(value) values[key] = '' if (value is None or value is False) else force_text(value)
else:
values = self.value
return self.__class__(self._field, values, self.errors, self._prefix) return self.__class__(self._field, values, self.errors, self._prefix)