| 209 | return [self.base_field.to_python(item) for item in value] |
| 210 | |
| 211 | def clean(self, value): |
| 212 | cleaned_data = [] |
| 213 | errors = [] |
| 214 | if not any(value) and self.required: |
| 215 | raise ValidationError(self.error_messages["required"]) |
| 216 | max_size = max(self.size, len(value)) |
| 217 | for index in range(max_size): |
| 218 | item = value[index] |
| 219 | try: |
| 220 | cleaned_data.append(self.base_field.clean(item)) |
| 221 | except ValidationError as error: |
| 222 | errors.append( |
| 223 | prefix_validation_error( |
| 224 | error, |
| 225 | self.error_messages["item_invalid"], |
| 226 | code="item_invalid", |
| 227 | params={"nth": index + 1}, |
| 228 | ) |
| 229 | ) |
| 230 | cleaned_data.append(item) |
| 231 | else: |
| 232 | errors.append(None) |
| 233 | cleaned_data, null_index = self._remove_trailing_nulls(cleaned_data) |
| 234 | if null_index is not None: |
| 235 | errors = errors[:null_index] |
| 236 | errors = list(filter(None, errors)) |
| 237 | if errors: |
| 238 | raise ValidationError(list(chain.from_iterable(errors))) |
| 239 | return cleaned_data |
| 240 | |
| 241 | def has_changed(self, initial, data): |
| 242 | try: |