diff --git a/addressfield/widgets.py b/addressfield/widgets.py index 7e1edce3880650de8cb89de22ca2f35b759f011c..11ef7ccbbd75936c83138c81049affe564debe8e 100644 --- a/addressfield/widgets.py +++ b/addressfield/widgets.py @@ -29,18 +29,31 @@ class NestedMultiWidget(KeepOwnAttrsWidget, forms.MultiWidget): ] super().__init__(widgets, *args, **kwargs) + @property + def field_names(self): + return list(self.components.keys()) + def decompress(self, value): if value: - return [value.get(field) for field in self.components.keys()] + decompressed = list() + for i, widget in enumerate(self.widgets): + if hasattr(widget, 'components'): + decompressed.append(widget.decompress(value)) + else: + decompressed.append(value.get(self.field_names[i])) + return decompressed return [None] * len(self.components) def value_from_datadict(self, data, files, name): - field_names = list(self.components.keys()) - return { - field_names[i]: widget.value_from_datadict(data, files, name + '_%s' % i) - for i, widget in enumerate(self.widgets) - } - + value = dict() + for i, widget in enumerate(self.widgets): + widget_value = widget.value_from_datadict(data, files, name + '_%s' % i) + # flatten the data structure to a single dict + if hasattr(widget, 'widgets'): + value.update(widget_value) + else: + value[self.field_names[i]] = widget_value + return value class LocalityWidget(NestedMultiWidget): components = {