|
36 | 36 | import logging |
37 | 37 | from collections import OrderedDict |
38 | 38 |
|
39 | | -from django import forms |
| 39 | +from django import VERSION, forms |
40 | 40 | from django.contrib.postgres.utils import prefix_validation_error |
41 | 41 | from django.utils.translation import ugettext as _ |
42 | 42 |
|
43 | 43 | from . import CompositeType |
44 | 44 |
|
45 | 45 | LOGGER = logging.getLogger(__name__) |
46 | 46 |
|
| 47 | +DJANGO21 = VERSION >= (2, 1) |
| 48 | + |
47 | 49 |
|
48 | 50 | class CompositeBoundField(forms.BoundField): |
49 | 51 | """ |
@@ -144,9 +146,13 @@ def clean(self, value): |
144 | 146 | try: |
145 | 147 | cleaned_data[name] = field.clean(value.get(name)) |
146 | 148 | except forms.ValidationError as error: |
| 149 | + if DJANGO21: |
| 150 | + prefix = '%(label)s:' |
| 151 | + else: |
| 152 | + prefix = '%(label)s: ' |
147 | 153 | errors.append(prefix_validation_error( |
148 | 154 | error, code='field_invalid', |
149 | | - prefix='%(label)s: ', params={'label': field.label})) |
| 155 | + prefix=prefix, params={'label': field.label})) |
150 | 156 | if errors: |
151 | 157 | raise forms.ValidationError(errors) |
152 | 158 | value = self.model(**cleaned_data) |
@@ -218,6 +224,10 @@ def value_from_datadict(self, data, files, name): |
218 | 224 | for subname, widget in self.widgets.items() |
219 | 225 | } |
220 | 226 |
|
| 227 | + def value_omitted_from_data(self, data, files, name): |
| 228 | + prefix = '{}-'.format(name) |
| 229 | + return not any(key.startswith(prefix) for key in data) |
| 230 | + |
221 | 231 | def id_for_label(self, id_): |
222 | 232 | """ |
223 | 233 | Wrapper around the field widget's `id_for_label` method. |
|
0 commit comments