Просмотр исходного кода

Extend GetReturnURLMixin to automatically resolve default return URL for querysets

Jeremy Stretch 5 лет назад
Родитель
Сommit
4613b69c28

+ 0 - 13
netbox/circuits/views.py

@@ -60,19 +60,16 @@ class ProviderEditView(ObjectEditView):
     queryset = Provider.objects.all()
     model_form = forms.ProviderForm
     template_name = 'circuits/provider_edit.html'
-    default_return_url = 'circuits:provider_list'
 
 
 class ProviderDeleteView(ObjectDeleteView):
     queryset = Provider.objects.all()
-    default_return_url = 'circuits:provider_list'
 
 
 class ProviderBulkImportView(BulkImportView):
     queryset = Provider.objects.all()
     model_form = forms.ProviderCSVForm
     table = tables.ProviderTable
-    default_return_url = 'circuits:provider_list'
 
 
 class ProviderBulkEditView(BulkEditView):
@@ -80,14 +77,12 @@ class ProviderBulkEditView(BulkEditView):
     filterset = filters.ProviderFilterSet
     table = tables.ProviderTable
     form = forms.ProviderBulkEditForm
-    default_return_url = 'circuits:provider_list'
 
 
 class ProviderBulkDeleteView(BulkDeleteView):
     queryset = Provider.objects.annotate(count_circuits=Count('circuits'))
     filterset = filters.ProviderFilterSet
     table = tables.ProviderTable
-    default_return_url = 'circuits:provider_list'
 
 
 #
@@ -102,20 +97,17 @@ class CircuitTypeListView(ObjectListView):
 class CircuitTypeEditView(ObjectEditView):
     queryset = CircuitType.objects.all()
     model_form = forms.CircuitTypeForm
-    default_return_url = 'circuits:circuittype_list'
 
 
 class CircuitTypeBulkImportView(BulkImportView):
     queryset = CircuitType.objects.all()
     model_form = forms.CircuitTypeCSVForm
     table = tables.CircuitTypeTable
-    default_return_url = 'circuits:circuittype_list'
 
 
 class CircuitTypeBulkDeleteView(BulkDeleteView):
     queryset = CircuitType.objects.annotate(circuit_count=Count('circuits'))
     table = tables.CircuitTypeTable
-    default_return_url = 'circuits:circuittype_list'
 
 
 #
@@ -165,19 +157,16 @@ class CircuitEditView(ObjectEditView):
     queryset = Circuit.objects.all()
     model_form = forms.CircuitForm
     template_name = 'circuits/circuit_edit.html'
-    default_return_url = 'circuits:circuit_list'
 
 
 class CircuitDeleteView(ObjectDeleteView):
     queryset = Circuit.objects.all()
-    default_return_url = 'circuits:circuit_list'
 
 
 class CircuitBulkImportView(BulkImportView):
     queryset = Circuit.objects.all()
     model_form = forms.CircuitCSVForm
     table = tables.CircuitTable
-    default_return_url = 'circuits:circuit_list'
 
 
 class CircuitBulkEditView(BulkEditView):
@@ -185,14 +174,12 @@ class CircuitBulkEditView(BulkEditView):
     filterset = filters.CircuitFilterSet
     table = tables.CircuitTable
     form = forms.CircuitBulkEditForm
-    default_return_url = 'circuits:circuit_list'
 
 
 class CircuitBulkDeleteView(BulkDeleteView):
     queryset = Circuit.objects.prefetch_related('provider', 'type', 'tenant').prefetch_related('terminations__site')
     filterset = filters.CircuitFilterSet
     table = tables.CircuitTable
-    default_return_url = 'circuits:circuit_list'
 
 
 class CircuitSwapTerminations(ObjectEditView):

+ 0 - 84
netbox/dcim/views.py

@@ -120,21 +120,18 @@ class RegionListView(ObjectListView):
 class RegionEditView(ObjectEditView):
     queryset = Region.objects.all()
     model_form = forms.RegionForm
-    default_return_url = 'dcim:region_list'
 
 
 class RegionBulkImportView(BulkImportView):
     queryset = Region.objects.all()
     model_form = forms.RegionCSVForm
     table = tables.RegionTable
-    default_return_url = 'dcim:region_list'
 
 
 class RegionBulkDeleteView(BulkDeleteView):
     queryset = Region.objects.all()
     filterset = filters.RegionFilterSet
     table = tables.RegionTable
-    default_return_url = 'dcim:region_list'
 
 
 #
@@ -179,19 +176,16 @@ class SiteEditView(ObjectEditView):
     queryset = Site.objects.all()
     model_form = forms.SiteForm
     template_name = 'dcim/site_edit.html'
-    default_return_url = 'dcim:site_list'
 
 
 class SiteDeleteView(ObjectDeleteView):
     queryset = Site.objects.all()
-    default_return_url = 'dcim:site_list'
 
 
 class SiteBulkImportView(BulkImportView):
     queryset = Site.objects.all()
     model_form = forms.SiteCSVForm
     table = tables.SiteTable
-    default_return_url = 'dcim:site_list'
 
 
 class SiteBulkEditView(BulkEditView):
@@ -199,14 +193,12 @@ class SiteBulkEditView(BulkEditView):
     filterset = filters.SiteFilterSet
     table = tables.SiteTable
     form = forms.SiteBulkEditForm
-    default_return_url = 'dcim:site_list'
 
 
 class SiteBulkDeleteView(BulkDeleteView):
     queryset = Site.objects.prefetch_related('region', 'tenant')
     filterset = filters.SiteFilterSet
     table = tables.SiteTable
-    default_return_url = 'dcim:site_list'
 
 
 #
@@ -229,21 +221,18 @@ class RackGroupListView(ObjectListView):
 class RackGroupEditView(ObjectEditView):
     queryset = RackGroup.objects.all()
     model_form = forms.RackGroupForm
-    default_return_url = 'dcim:rackgroup_list'
 
 
 class RackGroupBulkImportView(BulkImportView):
     queryset = RackGroup.objects.all()
     model_form = forms.RackGroupCSVForm
     table = tables.RackGroupTable
-    default_return_url = 'dcim:rackgroup_list'
 
 
 class RackGroupBulkDeleteView(BulkDeleteView):
     queryset = RackGroup.objects.prefetch_related('site').annotate(rack_count=Count('racks'))
     filterset = filters.RackGroupFilterSet
     table = tables.RackGroupTable
-    default_return_url = 'dcim:rackgroup_list'
 
 
 #
@@ -258,20 +247,17 @@ class RackRoleListView(ObjectListView):
 class RackRoleEditView(ObjectEditView):
     queryset = RackRole.objects.all()
     model_form = forms.RackRoleForm
-    default_return_url = 'dcim:rackrole_list'
 
 
 class RackRoleBulkImportView(BulkImportView):
     queryset = RackRole.objects.all()
     model_form = forms.RackRoleCSVForm
     table = tables.RackRoleTable
-    default_return_url = 'dcim:rackrole_list'
 
 
 class RackRoleBulkDeleteView(BulkDeleteView):
     queryset = RackRole.objects.annotate(rack_count=Count('racks'))
     table = tables.RackRoleTable
-    default_return_url = 'dcim:rackrole_list'
 
 
 #
@@ -363,19 +349,16 @@ class RackEditView(ObjectEditView):
     queryset = Rack.objects.all()
     model_form = forms.RackForm
     template_name = 'dcim/rack_edit.html'
-    default_return_url = 'dcim:rack_list'
 
 
 class RackDeleteView(ObjectDeleteView):
     queryset = Rack.objects.all()
-    default_return_url = 'dcim:rack_list'
 
 
 class RackBulkImportView(BulkImportView):
     queryset = Rack.objects.all()
     model_form = forms.RackCSVForm
     table = tables.RackTable
-    default_return_url = 'dcim:rack_list'
 
 
 class RackBulkEditView(BulkEditView):
@@ -383,14 +366,12 @@ class RackBulkEditView(BulkEditView):
     filterset = filters.RackFilterSet
     table = tables.RackTable
     form = forms.RackBulkEditForm
-    default_return_url = 'dcim:rack_list'
 
 
 class RackBulkDeleteView(BulkDeleteView):
     queryset = Rack.objects.prefetch_related('site', 'group', 'tenant', 'role')
     filterset = filters.RackFilterSet
     table = tables.RackTable
-    default_return_url = 'dcim:rack_list'
 
 
 #
@@ -421,7 +402,6 @@ class RackReservationEditView(ObjectEditView):
     queryset = RackReservation.objects.all()
     model_form = forms.RackReservationForm
     template_name = 'dcim/rackreservation_edit.html'
-    default_return_url = 'dcim:rackreservation_list'
 
     def alter_obj(self, obj, request, args, kwargs):
         if not obj.pk:
@@ -433,14 +413,12 @@ class RackReservationEditView(ObjectEditView):
 
 class RackReservationDeleteView(ObjectDeleteView):
     queryset = RackReservation.objects.all()
-    default_return_url = 'dcim:rackreservation_list'
 
 
 class RackReservationImportView(BulkImportView):
     queryset = RackReservation.objects.all()
     model_form = forms.RackReservationCSVForm
     table = tables.RackReservationTable
-    default_return_url = 'dcim:rackreservation_list'
 
     def _save_obj(self, obj_form, request):
         """
@@ -458,14 +436,12 @@ class RackReservationBulkEditView(BulkEditView):
     filterset = filters.RackReservationFilterSet
     table = tables.RackReservationTable
     form = forms.RackReservationBulkEditForm
-    default_return_url = 'dcim:rackreservation_list'
 
 
 class RackReservationBulkDeleteView(BulkDeleteView):
     queryset = RackReservation.objects.prefetch_related('rack', 'user')
     filterset = filters.RackReservationFilterSet
     table = tables.RackReservationTable
-    default_return_url = 'dcim:rackreservation_list'
 
 
 #
@@ -484,20 +460,17 @@ class ManufacturerListView(ObjectListView):
 class ManufacturerEditView(ObjectEditView):
     queryset = Manufacturer.objects.all()
     model_form = forms.ManufacturerForm
-    default_return_url = 'dcim:manufacturer_list'
 
 
 class ManufacturerBulkImportView(BulkImportView):
     queryset = Manufacturer.objects.all()
     model_form = forms.ManufacturerCSVForm
     table = tables.ManufacturerTable
-    default_return_url = 'dcim:manufacturer_list'
 
 
 class ManufacturerBulkDeleteView(BulkDeleteView):
     queryset = Manufacturer.objects.annotate(devicetype_count=Count('device_types'))
     table = tables.ManufacturerTable
-    default_return_url = 'dcim:manufacturer_list'
 
 
 #
@@ -580,12 +553,10 @@ class DeviceTypeEditView(ObjectEditView):
     queryset = DeviceType.objects.all()
     model_form = forms.DeviceTypeForm
     template_name = 'dcim/devicetype_edit.html'
-    default_return_url = 'dcim:devicetype_list'
 
 
 class DeviceTypeDeleteView(ObjectDeleteView):
     queryset = DeviceType.objects.all()
-    default_return_url = 'dcim:devicetype_list'
 
 
 class DeviceTypeImportView(ObjectImportView):
@@ -612,7 +583,6 @@ class DeviceTypeImportView(ObjectImportView):
         ('front-ports', forms.FrontPortTemplateImportForm),
         ('device-bays', forms.DeviceBayTemplateImportForm),
     ))
-    default_return_url = 'dcim:devicetype_import'
 
 
 class DeviceTypeBulkEditView(BulkEditView):
@@ -620,14 +590,12 @@ class DeviceTypeBulkEditView(BulkEditView):
     filterset = filters.DeviceTypeFilterSet
     table = tables.DeviceTypeTable
     form = forms.DeviceTypeBulkEditForm
-    default_return_url = 'dcim:devicetype_list'
 
 
 class DeviceTypeBulkDeleteView(BulkDeleteView):
     queryset = DeviceType.objects.prefetch_related('manufacturer').annotate(instance_count=Count('instances'))
     filterset = filters.DeviceTypeFilterSet
     table = tables.DeviceTypeTable
-    default_return_url = 'dcim:devicetype_list'
 
 
 #
@@ -890,20 +858,17 @@ class DeviceRoleListView(ObjectListView):
 class DeviceRoleEditView(ObjectEditView):
     queryset = DeviceRole.objects.all()
     model_form = forms.DeviceRoleForm
-    default_return_url = 'dcim:devicerole_list'
 
 
 class DeviceRoleBulkImportView(BulkImportView):
     queryset = DeviceRole.objects.all()
     model_form = forms.DeviceRoleCSVForm
     table = tables.DeviceRoleTable
-    default_return_url = 'dcim:devicerole_list'
 
 
 class DeviceRoleBulkDeleteView(BulkDeleteView):
     queryset = DeviceRole.objects.all()
     table = tables.DeviceRoleTable
-    default_return_url = 'dcim:devicerole_list'
 
 
 #
@@ -918,20 +883,17 @@ class PlatformListView(ObjectListView):
 class PlatformEditView(ObjectEditView):
     queryset = Platform.objects.all()
     model_form = forms.PlatformForm
-    default_return_url = 'dcim:platform_list'
 
 
 class PlatformBulkImportView(BulkImportView):
     queryset = Platform.objects.all()
     model_form = forms.PlatformCSVForm
     table = tables.PlatformTable
-    default_return_url = 'dcim:platform_list'
 
 
 class PlatformBulkDeleteView(BulkDeleteView):
     queryset = Platform.objects.all()
     table = tables.PlatformTable
-    default_return_url = 'dcim:platform_list'
 
 
 #
@@ -1118,12 +1080,10 @@ class DeviceEditView(ObjectEditView):
     queryset = Device.objects.all()
     model_form = forms.DeviceForm
     template_name = 'dcim/device_edit.html'
-    default_return_url = 'dcim:device_list'
 
 
 class DeviceDeleteView(ObjectDeleteView):
     queryset = Device.objects.all()
-    default_return_url = 'dcim:device_list'
 
 
 class DeviceBulkImportView(BulkImportView):
@@ -1131,7 +1091,6 @@ class DeviceBulkImportView(BulkImportView):
     model_form = forms.DeviceCSVForm
     table = tables.DeviceImportTable
     template_name = 'dcim/device_import.html'
-    default_return_url = 'dcim:device_list'
 
 
 class ChildDeviceBulkImportView(BulkImportView):
@@ -1139,7 +1098,6 @@ class ChildDeviceBulkImportView(BulkImportView):
     model_form = forms.ChildDeviceCSVForm
     table = tables.DeviceImportTable
     template_name = 'dcim/device_import_child.html'
-    default_return_url = 'dcim:device_list'
 
     def _save_obj(self, obj_form, request):
 
@@ -1158,14 +1116,12 @@ class DeviceBulkEditView(BulkEditView):
     filterset = filters.DeviceFilterSet
     table = tables.DeviceTable
     form = forms.DeviceBulkEditForm
-    default_return_url = 'dcim:device_list'
 
 
 class DeviceBulkDeleteView(BulkDeleteView):
     queryset = Device.objects.prefetch_related('tenant', 'site', 'rack', 'device_role', 'device_type__manufacturer')
     filterset = filters.DeviceFilterSet
     table = tables.DeviceTable
-    default_return_url = 'dcim:device_list'
 
 
 #
@@ -1204,7 +1160,6 @@ class ConsolePortBulkImportView(BulkImportView):
     queryset = ConsolePort.objects.all()
     model_form = forms.ConsolePortCSVForm
     table = tables.ConsolePortTable
-    default_return_url = 'dcim:consoleport_list'
 
 
 class ConsolePortBulkEditView(BulkEditView):
@@ -1226,7 +1181,6 @@ class ConsolePortBulkDeleteView(BulkDeleteView):
     queryset = ConsolePort.objects.all()
     filterset = filters.ConsolePortFilterSet
     table = tables.ConsolePortTable
-    default_return_url = 'dcim:consoleport_list'
 
 
 #
@@ -1265,7 +1219,6 @@ class ConsoleServerPortBulkImportView(BulkImportView):
     queryset = ConsoleServerPort.objects.all()
     model_form = forms.ConsoleServerPortCSVForm
     table = tables.ConsoleServerPortTable
-    default_return_url = 'dcim:consoleserverport_list'
 
 
 class ConsoleServerPortBulkEditView(BulkEditView):
@@ -1287,7 +1240,6 @@ class ConsoleServerPortBulkDeleteView(BulkDeleteView):
     queryset = ConsoleServerPort.objects.all()
     filterset = filters.ConsoleServerPortFilterSet
     table = tables.ConsoleServerPortTable
-    default_return_url = 'dcim:consoleserverport_list'
 
 
 #
@@ -1326,7 +1278,6 @@ class PowerPortBulkImportView(BulkImportView):
     queryset = PowerPort.objects.all()
     model_form = forms.PowerPortCSVForm
     table = tables.PowerPortTable
-    default_return_url = 'dcim:powerport_list'
 
 
 class PowerPortBulkEditView(BulkEditView):
@@ -1348,7 +1299,6 @@ class PowerPortBulkDeleteView(BulkDeleteView):
     queryset = PowerPort.objects.all()
     filterset = filters.PowerPortFilterSet
     table = tables.PowerPortTable
-    default_return_url = 'dcim:powerport_list'
 
 
 #
@@ -1387,7 +1337,6 @@ class PowerOutletBulkImportView(BulkImportView):
     queryset = PowerOutlet.objects.all()
     model_form = forms.PowerOutletCSVForm
     table = tables.PowerOutletTable
-    default_return_url = 'dcim:poweroutlet_list'
 
 
 class PowerOutletBulkEditView(BulkEditView):
@@ -1409,7 +1358,6 @@ class PowerOutletBulkDeleteView(BulkDeleteView):
     queryset = PowerOutlet.objects.all()
     filterset = filters.PowerOutletFilterSet
     table = tables.PowerOutletTable
-    default_return_url = 'dcim:poweroutlet_list'
 
 
 #
@@ -1481,7 +1429,6 @@ class InterfaceBulkImportView(BulkImportView):
     queryset = Interface.objects.all()
     model_form = forms.InterfaceCSVForm
     table = tables.InterfaceTable
-    default_return_url = 'dcim:interface_list'
 
 
 class InterfaceBulkEditView(BulkEditView):
@@ -1503,7 +1450,6 @@ class InterfaceBulkDeleteView(BulkDeleteView):
     queryset = Interface.objects.all()
     filterset = filters.InterfaceFilterSet
     table = tables.InterfaceTable
-    default_return_url = 'dcim:interface_list'
 
 
 #
@@ -1542,7 +1488,6 @@ class FrontPortBulkImportView(BulkImportView):
     queryset = FrontPort.objects.all()
     model_form = forms.FrontPortCSVForm
     table = tables.FrontPortTable
-    default_return_url = 'dcim:frontport_list'
 
 
 class FrontPortBulkEditView(BulkEditView):
@@ -1564,7 +1509,6 @@ class FrontPortBulkDeleteView(BulkDeleteView):
     queryset = FrontPort.objects.all()
     filterset = filters.FrontPortFilterSet
     table = tables.FrontPortTable
-    default_return_url = 'dcim:frontport_list'
 
 
 #
@@ -1603,7 +1547,6 @@ class RearPortBulkImportView(BulkImportView):
     queryset = RearPort.objects.all()
     model_form = forms.RearPortCSVForm
     table = tables.RearPortTable
-    default_return_url = 'dcim:rearport_list'
 
 
 class RearPortBulkEditView(BulkEditView):
@@ -1625,7 +1568,6 @@ class RearPortBulkDeleteView(BulkDeleteView):
     queryset = RearPort.objects.all()
     filterset = filters.RearPortFilterSet
     table = tables.RearPortTable
-    default_return_url = 'dcim:rearport_list'
 
 
 #
@@ -1731,7 +1673,6 @@ class DeviceBayBulkImportView(BulkImportView):
     queryset = DeviceBay.objects.all()
     model_form = forms.DeviceBayCSVForm
     table = tables.DeviceBayTable
-    default_return_url = 'dcim:devicebay_list'
 
 
 class DeviceBayBulkEditView(BulkEditView):
@@ -1749,7 +1690,6 @@ class DeviceBayBulkDeleteView(BulkDeleteView):
     queryset = DeviceBay.objects.all()
     filterset = filters.DeviceBayFilterSet
     table = tables.DeviceBayTable
-    default_return_url = 'dcim:devicebay_list'
 
 
 #
@@ -1901,7 +1841,6 @@ class CableTraceView(ObjectView):
 class CableCreateView(ObjectEditView):
     queryset = Cable.objects.all()
     template_name = 'dcim/cable_connect.html'
-    default_return_url = 'dcim:cable_list'
 
     def dispatch(self, request, *args, **kwargs):
 
@@ -1959,19 +1898,16 @@ class CableEditView(ObjectEditView):
     queryset = Cable.objects.all()
     model_form = forms.CableForm
     template_name = 'dcim/cable_edit.html'
-    default_return_url = 'dcim:cable_list'
 
 
 class CableDeleteView(ObjectDeleteView):
     queryset = Cable.objects.all()
-    default_return_url = 'dcim:cable_list'
 
 
 class CableBulkImportView(BulkImportView):
     queryset = Cable.objects.all()
     model_form = forms.CableCSVForm
     table = tables.CableTable
-    default_return_url = 'dcim:cable_list'
 
 
 class CableBulkEditView(BulkEditView):
@@ -1979,14 +1915,12 @@ class CableBulkEditView(BulkEditView):
     filterset = filters.CableFilterSet
     table = tables.CableTable
     form = forms.CableBulkEditForm
-    default_return_url = 'dcim:cable_list'
 
 
 class CableBulkDeleteView(BulkDeleteView):
     queryset = Cable.objects.prefetch_related('termination_a', 'termination_b')
     filterset = filters.CableFilterSet
     table = tables.CableTable
-    default_return_url = 'dcim:cable_list'
 
 
 #
@@ -2122,7 +2056,6 @@ class InventoryItemBulkImportView(BulkImportView):
     queryset = InventoryItem.objects.all()
     model_form = forms.InventoryItemCSVForm
     table = tables.InventoryItemTable
-    default_return_url = 'dcim:inventoryitem_list'
 
 
 class InventoryItemBulkEditView(BulkEditView):
@@ -2130,14 +2063,12 @@ class InventoryItemBulkEditView(BulkEditView):
     filterset = filters.InventoryItemFilterSet
     table = tables.InventoryItemTable
     form = forms.InventoryItemBulkEditForm
-    default_return_url = 'dcim:inventoryitem_list'
 
 
 class InventoryItemBulkDeleteView(BulkDeleteView):
     queryset = InventoryItem.objects.prefetch_related('device', 'manufacturer')
     table = tables.InventoryItemTable
     template_name = 'dcim/inventoryitem_bulk_delete.html'
-    default_return_url = 'dcim:inventoryitem_list'
 
 
 #
@@ -2169,7 +2100,6 @@ class VirtualChassisCreateView(ObjectEditView):
     queryset = VirtualChassis.objects.all()
     model_form = forms.VirtualChassisCreateForm
     template_name = 'dcim/virtualchassis_add.html'
-    default_return_url = 'dcim:virtualchassis_list'
 
 
 class VirtualChassisEditView(ObjectPermissionRequiredMixin, GetReturnURLMixin, View):
@@ -2242,7 +2172,6 @@ class VirtualChassisEditView(ObjectPermissionRequiredMixin, GetReturnURLMixin, V
 
 class VirtualChassisDeleteView(ObjectDeleteView):
     queryset = VirtualChassis.objects.all()
-    default_return_url = 'dcim:device_list'
 
 
 class VirtualChassisAddMemberView(ObjectPermissionRequiredMixin, GetReturnURLMixin, View):
@@ -2356,7 +2285,6 @@ class VirtualChassisBulkImportView(BulkImportView):
     queryset = VirtualChassis.objects.all()
     model_form = forms.VirtualChassisCSVForm
     table = tables.VirtualChassisTable
-    default_return_url = 'dcim:virtualchassis_list'
 
 
 class VirtualChassisBulkEditView(BulkEditView):
@@ -2364,14 +2292,12 @@ class VirtualChassisBulkEditView(BulkEditView):
     filterset = filters.VirtualChassisFilterSet
     table = tables.VirtualChassisTable
     form = forms.VirtualChassisBulkEditForm
-    default_return_url = 'dcim:virtualchassis_list'
 
 
 class VirtualChassisBulkDeleteView(BulkDeleteView):
     queryset = VirtualChassis.objects.all()
     filterset = filters.VirtualChassisFilterSet
     table = tables.VirtualChassisTable
-    default_return_url = 'dcim:virtualchassis_list'
 
 
 #
@@ -2411,19 +2337,16 @@ class PowerPanelView(ObjectView):
 class PowerPanelEditView(ObjectEditView):
     queryset = PowerPanel.objects.all()
     model_form = forms.PowerPanelForm
-    default_return_url = 'dcim:powerpanel_list'
 
 
 class PowerPanelDeleteView(ObjectDeleteView):
     queryset = PowerPanel.objects.all()
-    default_return_url = 'dcim:powerpanel_list'
 
 
 class PowerPanelBulkImportView(BulkImportView):
     queryset = PowerPanel.objects.all()
     model_form = forms.PowerPanelCSVForm
     table = tables.PowerPanelTable
-    default_return_url = 'dcim:powerpanel_list'
 
 
 class PowerPanelBulkEditView(BulkEditView):
@@ -2431,7 +2354,6 @@ class PowerPanelBulkEditView(BulkEditView):
     filterset = filters.PowerPanelFilterSet
     table = tables.PowerPanelTable
     form = forms.PowerPanelBulkEditForm
-    default_return_url = 'dcim:powerpanel_list'
 
 
 class PowerPanelBulkDeleteView(BulkDeleteView):
@@ -2442,7 +2364,6 @@ class PowerPanelBulkDeleteView(BulkDeleteView):
     )
     filterset = filters.PowerPanelFilterSet
     table = tables.PowerPanelTable
-    default_return_url = 'dcim:powerpanel_list'
 
 
 #
@@ -2474,19 +2395,16 @@ class PowerFeedEditView(ObjectEditView):
     queryset = PowerFeed.objects.all()
     model_form = forms.PowerFeedForm
     template_name = 'dcim/powerfeed_edit.html'
-    default_return_url = 'dcim:powerfeed_list'
 
 
 class PowerFeedDeleteView(ObjectDeleteView):
     queryset = PowerFeed.objects.all()
-    default_return_url = 'dcim:powerfeed_list'
 
 
 class PowerFeedBulkImportView(BulkImportView):
     queryset = PowerFeed.objects.all()
     model_form = forms.PowerFeedCSVForm
     table = tables.PowerFeedTable
-    default_return_url = 'dcim:powerfeed_list'
 
 
 class PowerFeedBulkEditView(BulkEditView):
@@ -2494,11 +2412,9 @@ class PowerFeedBulkEditView(BulkEditView):
     filterset = filters.PowerFeedFilterSet
     table = tables.PowerFeedTable
     form = forms.PowerFeedBulkEditForm
-    default_return_url = 'dcim:powerfeed_list'
 
 
 class PowerFeedBulkDeleteView(BulkDeleteView):
     queryset = PowerFeed.objects.prefetch_related('power_panel', 'rack')
     filterset = filters.PowerFeedFilterSet
     table = tables.PowerFeedTable
-    default_return_url = 'dcim:powerfeed_list'

+ 0 - 9
netbox/extras/views.py

@@ -70,20 +70,17 @@ class TagView(ObjectView):
 class TagEditView(ObjectEditView):
     queryset = Tag.objects.all()
     model_form = forms.TagForm
-    default_return_url = 'extras:tag_list'
     template_name = 'extras/tag_edit.html'
 
 
 class TagDeleteView(ObjectDeleteView):
     queryset = Tag.objects.all()
-    default_return_url = 'extras:tag_list'
 
 
 class TagBulkImportView(BulkImportView):
     queryset = Tag.objects.all()
     model_form = forms.TagCSVForm
     table = tables.TagTable
-    default_return_url = 'extras:tag_list'
 
 
 class TagBulkEditView(BulkEditView):
@@ -94,7 +91,6 @@ class TagBulkEditView(BulkEditView):
     )
     table = tables.TagTable
     form = forms.TagBulkEditForm
-    default_return_url = 'extras:tag_list'
 
 
 class TagBulkDeleteView(BulkDeleteView):
@@ -104,7 +100,6 @@ class TagBulkDeleteView(BulkDeleteView):
         'name'
     )
     table = tables.TagTable
-    default_return_url = 'extras:tag_list'
 
 
 #
@@ -156,7 +151,6 @@ class ConfigContextView(ObjectView):
 class ConfigContextEditView(ObjectEditView):
     queryset = ConfigContext.objects.all()
     model_form = forms.ConfigContextForm
-    default_return_url = 'extras:configcontext_list'
     template_name = 'extras/configcontext_edit.html'
 
 
@@ -165,18 +159,15 @@ class ConfigContextBulkEditView(BulkEditView):
     filterset = filters.ConfigContextFilterSet
     table = tables.ConfigContextTable
     form = forms.ConfigContextBulkEditForm
-    default_return_url = 'extras:configcontext_list'
 
 
 class ConfigContextDeleteView(ObjectDeleteView):
     queryset = ConfigContext.objects.all()
-    default_return_url = 'extras:configcontext_list'
 
 
 class ConfigContextBulkDeleteView(BulkDeleteView):
     queryset = ConfigContext.objects.all()
     table = tables.ConfigContextTable
-    default_return_url = 'extras:configcontext_list'
 
 
 class ObjectConfigContextView(ObjectView):

+ 0 - 38
netbox/ipam/views.py

@@ -48,19 +48,16 @@ class VRFEditView(ObjectEditView):
     queryset = VRF.objects.all()
     model_form = forms.VRFForm
     template_name = 'ipam/vrf_edit.html'
-    default_return_url = 'ipam:vrf_list'
 
 
 class VRFDeleteView(ObjectDeleteView):
     queryset = VRF.objects.all()
-    default_return_url = 'ipam:vrf_list'
 
 
 class VRFBulkImportView(BulkImportView):
     queryset = VRF.objects.all()
     model_form = forms.VRFCSVForm
     table = tables.VRFTable
-    default_return_url = 'ipam:vrf_list'
 
 
 class VRFBulkEditView(BulkEditView):
@@ -68,14 +65,12 @@ class VRFBulkEditView(BulkEditView):
     filterset = filters.VRFFilterSet
     table = tables.VRFTable
     form = forms.VRFBulkEditForm
-    default_return_url = 'ipam:vrf_list'
 
 
 class VRFBulkDeleteView(BulkDeleteView):
     queryset = VRF.objects.prefetch_related('tenant')
     filterset = filters.VRFFilterSet
     table = tables.VRFTable
-    default_return_url = 'ipam:vrf_list'
 
 
 #
@@ -163,21 +158,18 @@ class RIRListView(ObjectListView):
 class RIREditView(ObjectEditView):
     queryset = RIR.objects.all()
     model_form = forms.RIRForm
-    default_return_url = 'ipam:rir_list'
 
 
 class RIRBulkImportView(BulkImportView):
     queryset = RIR.objects.all()
     model_form = forms.RIRCSVForm
     table = tables.RIRTable
-    default_return_url = 'ipam:rir_list'
 
 
 class RIRBulkDeleteView(BulkDeleteView):
     queryset = RIR.objects.annotate(aggregate_count=Count('aggregates'))
     filterset = filters.RIRFilterSet
     table = tables.RIRTable
-    default_return_url = 'ipam:rir_list'
 
 
 #
@@ -259,19 +251,16 @@ class AggregateEditView(ObjectEditView):
     queryset = Aggregate.objects.all()
     model_form = forms.AggregateForm
     template_name = 'ipam/aggregate_edit.html'
-    default_return_url = 'ipam:aggregate_list'
 
 
 class AggregateDeleteView(ObjectDeleteView):
     queryset = Aggregate.objects.all()
-    default_return_url = 'ipam:aggregate_list'
 
 
 class AggregateBulkImportView(BulkImportView):
     queryset = Aggregate.objects.all()
     model_form = forms.AggregateCSVForm
     table = tables.AggregateTable
-    default_return_url = 'ipam:aggregate_list'
 
 
 class AggregateBulkEditView(BulkEditView):
@@ -279,14 +268,12 @@ class AggregateBulkEditView(BulkEditView):
     filterset = filters.AggregateFilterSet
     table = tables.AggregateTable
     form = forms.AggregateBulkEditForm
-    default_return_url = 'ipam:aggregate_list'
 
 
 class AggregateBulkDeleteView(BulkDeleteView):
     queryset = Aggregate.objects.prefetch_related('rir')
     filterset = filters.AggregateFilterSet
     table = tables.AggregateTable
-    default_return_url = 'ipam:aggregate_list'
 
 
 #
@@ -301,20 +288,17 @@ class RoleListView(ObjectListView):
 class RoleEditView(ObjectEditView):
     queryset = Role.objects.all()
     model_form = forms.RoleForm
-    default_return_url = 'ipam:role_list'
 
 
 class RoleBulkImportView(BulkImportView):
     queryset = Role.objects.all()
     model_form = forms.RoleCSVForm
     table = tables.RoleTable
-    default_return_url = 'ipam:role_list'
 
 
 class RoleBulkDeleteView(BulkDeleteView):
     queryset = Role.objects.all()
     table = tables.RoleTable
-    default_return_url = 'ipam:role_list'
 
 
 #
@@ -470,20 +454,17 @@ class PrefixEditView(ObjectEditView):
     queryset = Prefix.objects.all()
     model_form = forms.PrefixForm
     template_name = 'ipam/prefix_edit.html'
-    default_return_url = 'ipam:prefix_list'
 
 
 class PrefixDeleteView(ObjectDeleteView):
     queryset = Prefix.objects.all()
     template_name = 'ipam/prefix_delete.html'
-    default_return_url = 'ipam:prefix_list'
 
 
 class PrefixBulkImportView(BulkImportView):
     queryset = Prefix.objects.all()
     model_form = forms.PrefixCSVForm
     table = tables.PrefixTable
-    default_return_url = 'ipam:prefix_list'
 
 
 class PrefixBulkEditView(BulkEditView):
@@ -491,14 +472,12 @@ class PrefixBulkEditView(BulkEditView):
     filterset = filters.PrefixFilterSet
     table = tables.PrefixTable
     form = forms.PrefixBulkEditForm
-    default_return_url = 'ipam:prefix_list'
 
 
 class PrefixBulkDeleteView(BulkDeleteView):
     queryset = Prefix.objects.prefetch_related('site', 'vrf__tenant', 'tenant', 'vlan', 'role')
     filterset = filters.PrefixFilterSet
     table = tables.PrefixTable
-    default_return_url = 'ipam:prefix_list'
 
 
 #
@@ -569,7 +548,6 @@ class IPAddressEditView(ObjectEditView):
     queryset = IPAddress.objects.all()
     model_form = forms.IPAddressForm
     template_name = 'ipam/ipaddress_edit.html'
-    default_return_url = 'ipam:ipaddress_list'
 
     def alter_obj(self, obj, request, url_args, url_kwargs):
 
@@ -630,7 +608,6 @@ class IPAddressAssignView(ObjectView):
 
 class IPAddressDeleteView(ObjectDeleteView):
     queryset = IPAddress.objects.all()
-    default_return_url = 'ipam:ipaddress_list'
 
 
 class IPAddressBulkCreateView(BulkCreateView):
@@ -639,14 +616,12 @@ class IPAddressBulkCreateView(BulkCreateView):
     model_form = forms.IPAddressBulkAddForm
     pattern_target = 'address'
     template_name = 'ipam/ipaddress_bulk_add.html'
-    default_return_url = 'ipam:ipaddress_list'
 
 
 class IPAddressBulkImportView(BulkImportView):
     queryset = IPAddress.objects.all()
     model_form = forms.IPAddressCSVForm
     table = tables.IPAddressTable
-    default_return_url = 'ipam:ipaddress_list'
 
 
 class IPAddressBulkEditView(BulkEditView):
@@ -654,14 +629,12 @@ class IPAddressBulkEditView(BulkEditView):
     filterset = filters.IPAddressFilterSet
     table = tables.IPAddressTable
     form = forms.IPAddressBulkEditForm
-    default_return_url = 'ipam:ipaddress_list'
 
 
 class IPAddressBulkDeleteView(BulkDeleteView):
     queryset = IPAddress.objects.prefetch_related('vrf__tenant', 'tenant')
     filterset = filters.IPAddressFilterSet
     table = tables.IPAddressTable
-    default_return_url = 'ipam:ipaddress_list'
 
 
 #
@@ -678,21 +651,18 @@ class VLANGroupListView(ObjectListView):
 class VLANGroupEditView(ObjectEditView):
     queryset = VLANGroup.objects.all()
     model_form = forms.VLANGroupForm
-    default_return_url = 'ipam:vlangroup_list'
 
 
 class VLANGroupBulkImportView(BulkImportView):
     queryset = VLANGroup.objects.all()
     model_form = forms.VLANGroupCSVForm
     table = tables.VLANGroupTable
-    default_return_url = 'ipam:vlangroup_list'
 
 
 class VLANGroupBulkDeleteView(BulkDeleteView):
     queryset = VLANGroup.objects.prefetch_related('site').annotate(vlan_count=Count('vlans'))
     filterset = filters.VLANGroupFilterSet
     table = tables.VLANGroupTable
-    default_return_url = 'ipam:vlangroup_list'
 
 
 class VLANGroupVLANsView(ObjectView):
@@ -789,19 +759,16 @@ class VLANEditView(ObjectEditView):
     queryset = VLAN.objects.all()
     model_form = forms.VLANForm
     template_name = 'ipam/vlan_edit.html'
-    default_return_url = 'ipam:vlan_list'
 
 
 class VLANDeleteView(ObjectDeleteView):
     queryset = VLAN.objects.all()
-    default_return_url = 'ipam:vlan_list'
 
 
 class VLANBulkImportView(BulkImportView):
     queryset = VLAN.objects.all()
     model_form = forms.VLANCSVForm
     table = tables.VLANTable
-    default_return_url = 'ipam:vlan_list'
 
 
 class VLANBulkEditView(BulkEditView):
@@ -809,14 +776,12 @@ class VLANBulkEditView(BulkEditView):
     filterset = filters.VLANFilterSet
     table = tables.VLANTable
     form = forms.VLANBulkEditForm
-    default_return_url = 'ipam:vlan_list'
 
 
 class VLANBulkDeleteView(BulkDeleteView):
     queryset = VLAN.objects.prefetch_related('site', 'group', 'tenant', 'role')
     filterset = filters.VLANFilterSet
     table = tables.VLANTable
-    default_return_url = 'ipam:vlan_list'
 
 
 #
@@ -863,7 +828,6 @@ class ServiceBulkImportView(BulkImportView):
     queryset = Service.objects.all()
     model_form = forms.ServiceCSVForm
     table = tables.ServiceTable
-    default_return_url = 'ipam:service_list'
 
 
 class ServiceDeleteView(ObjectDeleteView):
@@ -875,11 +839,9 @@ class ServiceBulkEditView(BulkEditView):
     filterset = filters.ServiceFilterSet
     table = tables.ServiceTable
     form = forms.ServiceBulkEditForm
-    default_return_url = 'ipam:service_list'
 
 
 class ServiceBulkDeleteView(BulkDeleteView):
     queryset = Service.objects.prefetch_related('device', 'virtual_machine')
     filterset = filters.ServiceFilterSet
     table = tables.ServiceTable
-    default_return_url = 'ipam:service_list'

+ 0 - 7
netbox/secrets/views.py

@@ -36,20 +36,17 @@ class SecretRoleListView(ObjectListView):
 class SecretRoleEditView(ObjectEditView):
     queryset = SecretRole.objects.all()
     model_form = forms.SecretRoleForm
-    default_return_url = 'secrets:secretrole_list'
 
 
 class SecretRoleBulkImportView(BulkImportView):
     queryset = SecretRole.objects.all()
     model_form = forms.SecretRoleCSVForm
     table = tables.SecretRoleTable
-    default_return_url = 'secrets:secretrole_list'
 
 
 class SecretRoleBulkDeleteView(BulkDeleteView):
     queryset = SecretRole.objects.annotate(secret_count=Count('secrets'))
     table = tables.SecretRoleTable
-    default_return_url = 'secrets:secretrole_list'
 
 
 #
@@ -147,7 +144,6 @@ class SecretEditView(ObjectEditView):
 
 class SecretDeleteView(ObjectDeleteView):
     queryset = Secret.objects.all()
-    default_return_url = 'secrets:secret_list'
 
 
 class SecretBulkImportView(BulkImportView):
@@ -155,7 +151,6 @@ class SecretBulkImportView(BulkImportView):
     model_form = forms.SecretCSVForm
     table = tables.SecretTable
     template_name = 'secrets/secret_import.html'
-    default_return_url = 'secrets:secret_list'
     widget_attrs = {'class': 'requires-session-key'}
 
     master_key = None
@@ -203,11 +198,9 @@ class SecretBulkEditView(BulkEditView):
     filterset = filters.SecretFilterSet
     table = tables.SecretTable
     form = forms.SecretBulkEditForm
-    default_return_url = 'secrets:secret_list'
 
 
 class SecretBulkDeleteView(BulkDeleteView):
     queryset = Secret.objects.prefetch_related('role', 'device')
     filterset = filters.SecretFilterSet
     table = tables.SecretTable
-    default_return_url = 'secrets:secret_list'

+ 0 - 8
netbox/tenancy/views.py

@@ -30,20 +30,17 @@ class TenantGroupListView(ObjectListView):
 class TenantGroupEditView(ObjectEditView):
     queryset = TenantGroup.objects.all()
     model_form = forms.TenantGroupForm
-    default_return_url = 'tenancy:tenantgroup_list'
 
 
 class TenantGroupBulkImportView(BulkImportView):
     queryset = TenantGroup.objects.all()
     model_form = forms.TenantGroupCSVForm
     table = tables.TenantGroupTable
-    default_return_url = 'tenancy:tenantgroup_list'
 
 
 class TenantGroupBulkDeleteView(BulkDeleteView):
     queryset = TenantGroup.objects.annotate(tenant_count=Count('tenants'))
     table = tables.TenantGroupTable
-    default_return_url = 'tenancy:tenantgroup_list'
 
 
 #
@@ -87,19 +84,16 @@ class TenantEditView(ObjectEditView):
     queryset = Tenant.objects.all()
     model_form = forms.TenantForm
     template_name = 'tenancy/tenant_edit.html'
-    default_return_url = 'tenancy:tenant_list'
 
 
 class TenantDeleteView(ObjectDeleteView):
     queryset = Tenant.objects.all()
-    default_return_url = 'tenancy:tenant_list'
 
 
 class TenantBulkImportView(BulkImportView):
     queryset = Tenant.objects.all()
     model_form = forms.TenantCSVForm
     table = tables.TenantTable
-    default_return_url = 'tenancy:tenant_list'
 
 
 class TenantBulkEditView(BulkEditView):
@@ -107,11 +101,9 @@ class TenantBulkEditView(BulkEditView):
     filterset = filters.TenantFilterSet
     table = tables.TenantTable
     form = forms.TenantBulkEditForm
-    default_return_url = 'tenancy:tenant_list'
 
 
 class TenantBulkDeleteView(BulkDeleteView):
     queryset = Tenant.objects.prefetch_related('group')
     filterset = filters.TenantFilterSet
     table = tables.TenantTable
-    default_return_url = 'tenancy:tenant_list'

+ 12 - 3
netbox/utilities/views.py

@@ -16,6 +16,7 @@ from django.shortcuts import get_object_or_404, redirect, render
 from django.template import loader
 from django.template.exceptions import TemplateDoesNotExist
 from django.urls import reverse
+from django.urls.exceptions import NoReverseMatch
 from django.utils.decorators import method_decorator
 from django.utils.html import escape
 from django.utils.http import is_safe_url
@@ -86,7 +87,7 @@ class ObjectPermissionRequiredMixin(AccessMixin):
         return super().dispatch(request, *args, **kwargs)
 
 
-class GetReturnURLMixin(object):
+class GetReturnURLMixin:
     """
     Provides logic for determining where a user should be redirected after processing a form.
     """
@@ -101,13 +102,21 @@ class GetReturnURLMixin(object):
             return query_param
 
         # Next, check if the object being modified (if any) has an absolute URL.
-        elif obj is not None and obj.pk and hasattr(obj, 'get_absolute_url'):
+        if obj is not None and obj.pk and hasattr(obj, 'get_absolute_url'):
             return obj.get_absolute_url()
 
         # Fall back to the default URL (if specified) for the view.
-        elif self.default_return_url is not None:
+        if self.default_return_url is not None:
             return reverse(self.default_return_url)
 
+        # Attempt to dynamically resolve the list view for the object
+        if hasattr(self, 'queryset'):
+            model_opts = self.queryset.model._meta
+            try:
+                return reverse(f'{model_opts.app_label}:{model_opts.model_name}_list')
+            except NoReverseMatch:
+                pass
+
         # If all else fails, return home. Ideally this should never happen.
         return reverse('home')
 

+ 0 - 17
netbox/virtualization/views.py

@@ -29,20 +29,17 @@ class ClusterTypeListView(ObjectListView):
 class ClusterTypeEditView(ObjectEditView):
     queryset = ClusterType.objects.all()
     model_form = forms.ClusterTypeForm
-    default_return_url = 'virtualization:clustertype_list'
 
 
 class ClusterTypeBulkImportView(BulkImportView):
     queryset = ClusterType.objects.all()
     model_form = forms.ClusterTypeCSVForm
     table = tables.ClusterTypeTable
-    default_return_url = 'virtualization:clustertype_list'
 
 
 class ClusterTypeBulkDeleteView(BulkDeleteView):
     queryset = ClusterType.objects.annotate(cluster_count=Count('clusters'))
     table = tables.ClusterTypeTable
-    default_return_url = 'virtualization:clustertype_list'
 
 
 #
@@ -57,20 +54,17 @@ class ClusterGroupListView(ObjectListView):
 class ClusterGroupEditView(ObjectEditView):
     queryset = ClusterGroup.objects.all()
     model_form = forms.ClusterGroupForm
-    default_return_url = 'virtualization:clustergroup_list'
 
 
 class ClusterGroupBulkImportView(BulkImportView):
     queryset = ClusterGroup.objects.all()
     model_form = forms.ClusterGroupCSVForm
     table = tables.ClusterGroupTable
-    default_return_url = 'virtualization:clustergroup_list'
 
 
 class ClusterGroupBulkDeleteView(BulkDeleteView):
     queryset = ClusterGroup.objects.annotate(cluster_count=Count('clusters'))
     table = tables.ClusterGroupTable
-    default_return_url = 'virtualization:clustergroup_list'
 
 
 #
@@ -114,14 +108,12 @@ class ClusterEditView(ObjectEditView):
 
 class ClusterDeleteView(ObjectDeleteView):
     queryset = Cluster.objects.all()
-    default_return_url = 'virtualization:cluster_list'
 
 
 class ClusterBulkImportView(BulkImportView):
     queryset = Cluster.objects.all()
     model_form = forms.ClusterCSVForm
     table = tables.ClusterTable
-    default_return_url = 'virtualization:cluster_list'
 
 
 class ClusterBulkEditView(BulkEditView):
@@ -129,14 +121,12 @@ class ClusterBulkEditView(BulkEditView):
     filterset = filters.ClusterFilterSet
     table = tables.ClusterTable
     form = forms.ClusterBulkEditForm
-    default_return_url = 'virtualization:cluster_list'
 
 
 class ClusterBulkDeleteView(BulkDeleteView):
     queryset = Cluster.objects.prefetch_related('type', 'group', 'site')
     filterset = filters.ClusterFilterSet
     table = tables.ClusterTable
-    default_return_url = 'virtualization:cluster_list'
 
 
 class ClusterAddDevicesView(ObjectEditView):
@@ -266,19 +256,16 @@ class VirtualMachineEditView(ObjectEditView):
     queryset = VirtualMachine.objects.all()
     model_form = forms.VirtualMachineForm
     template_name = 'virtualization/virtualmachine_edit.html'
-    default_return_url = 'virtualization:virtualmachine_list'
 
 
 class VirtualMachineDeleteView(ObjectDeleteView):
     queryset = VirtualMachine.objects.all()
-    default_return_url = 'virtualization:virtualmachine_list'
 
 
 class VirtualMachineBulkImportView(BulkImportView):
     queryset = VirtualMachine.objects.all()
     model_form = forms.VirtualMachineCSVForm
     table = tables.VirtualMachineTable
-    default_return_url = 'virtualization:virtualmachine_list'
 
 
 class VirtualMachineBulkEditView(BulkEditView):
@@ -286,14 +273,12 @@ class VirtualMachineBulkEditView(BulkEditView):
     filterset = filters.VirtualMachineFilterSet
     table = tables.VirtualMachineTable
     form = forms.VirtualMachineBulkEditForm
-    default_return_url = 'virtualization:virtualmachine_list'
 
 
 class VirtualMachineBulkDeleteView(BulkDeleteView):
     queryset = VirtualMachine.objects.prefetch_related('cluster', 'tenant', 'role')
     filterset = filters.VirtualMachineFilterSet
     table = tables.VirtualMachineTable
-    default_return_url = 'virtualization:virtualmachine_list'
 
 
 #
@@ -364,7 +349,6 @@ class VMInterfaceBulkImportView(BulkImportView):
     queryset = VMInterface.objects.all()
     model_form = forms.VMInterfaceCSVForm
     table = tables.VMInterfaceTable
-    default_return_url = 'virtualization:vminterface_list'
 
 
 class VMInterfaceBulkEditView(BulkEditView):
@@ -395,4 +379,3 @@ class VirtualMachineBulkAddInterfaceView(BulkComponentCreateView):
     model_form = forms.VMInterfaceForm
     filterset = filters.VirtualMachineFilterSet
     table = tables.VirtualMachineTable
-    default_return_url = 'virtualization:virtualmachine_list'