diff --git a/netbox/dcim/tests/test_views.py b/netbox/dcim/tests/test_views.py index 21d9e80aa..1643e381a 100644 --- a/netbox/dcim/tests/test_views.py +++ b/netbox/dcim/tests/test_views.py @@ -1036,8 +1036,7 @@ module-bays: response = self.client.post(reverse('dcim:devicetype_bulk_import'), data=form_data, follow=True) self.assertHttpStatus(response, 200) - # TODO record index should be 2 - self.assertContains(response, "Record 3 module-bays[3].name: This field is required.") + self.assertContains(response, "Record 2 module-bays[3].name: This field is required.") def test_export_objects(self): url = reverse('dcim:devicetype_list') diff --git a/netbox/netbox/views/generic/bulk_views.py b/netbox/netbox/views/generic/bulk_views.py index 228e79d7c..4b8bc61e9 100644 --- a/netbox/netbox/views/generic/bulk_views.py +++ b/netbox/netbox/views/generic/bulk_views.py @@ -368,7 +368,7 @@ class BulkImportView(GetReturnURLMixin, BaseMultiObjectView): error_messages.append(f"Record {index} {prefix}{field_name}: {err}") return error_messages - def _save_object(self, model_form, request): + def _save_object(self, model_form, request, parent_idx): _action = 'Updated' if model_form.instance.pk else 'Created' # Save the primary object @@ -396,7 +396,7 @@ class BulkImportView(GetReturnURLMixin, BaseMultiObjectView): else: # Replicate errors on the related object form to the import form for display and abort raise ValidationError( - self._compile_form_errors(f.errors, index=i, prefix=f'{field_name}[{i}]') + self._compile_form_errors(f.errors, index=parent_idx, prefix=f'{field_name}[{i}]') ) # Enforce object-level permissions on related objects @@ -481,7 +481,7 @@ class BulkImportView(GetReturnURLMixin, BaseMultiObjectView): restrict_form_fields(model_form, request.user) if model_form.is_valid(): - obj = self._save_object(model_form, request) + obj = self._save_object(model_form, request, i) saved_objects.append(obj) else: # Raise model form errors