diff --git a/docs/release-notes/version-2.8.md b/docs/release-notes/version-2.8.md index 7b6d545ee..05487516f 100644 --- a/docs/release-notes/version-2.8.md +++ b/docs/release-notes/version-2.8.md @@ -1,6 +1,6 @@ # NetBox v2.8 -## v2.8.7 (FUTURE) +## v2.8.8 (FUTURE) ### Bug Fixes diff --git a/netbox/dcim/api/views.py b/netbox/dcim/api/views.py index 6de2a5982..fdd58ef12 100644 --- a/netbox/dcim/api/views.py +++ b/netbox/dcim/api/views.py @@ -376,7 +376,7 @@ class DeviceViewSet(CustomFieldModelViewSet): if device.platform is None: raise ServiceUnavailable("No platform is configured for this device.") if not device.platform.napalm_driver: - raise ServiceUnavailable("No NAPALM driver is configured for this device's platform ().".format( + raise ServiceUnavailable("No NAPALM driver is configured for this device's platform {}.".format( device.platform )) diff --git a/netbox/utilities/forms.py b/netbox/utilities/forms.py index 583a2f85a..5c4b58213 100644 --- a/netbox/utilities/forms.py +++ b/netbox/utilities/forms.py @@ -611,16 +611,6 @@ class DynamicModelChoiceMixin: filter = django_filters.ModelChoiceFilter widget = APISelect - def filter_queryset(self, data): - field_name = getattr(self, 'to_field_name') or 'pk' - # If multiple values have been provided, use only the last. - if type(data) in (list, tuple): - data = data[-1] - filter = self.filter( - field_name=field_name - ) - return filter.filter(self.queryset, data) - def get_bound_field(self, form, field_name): bound_field = BoundField(form, self, field_name) @@ -628,7 +618,13 @@ class DynamicModelChoiceMixin: # will be populated on-demand via the APISelect widget. data = bound_field.value() if data: - self.queryset = self.filter_queryset(data) + field_name = getattr(self, 'to_field_name') or 'pk' + filter = self.filter(field_name=field_name) + try: + self.queryset = filter.filter(self.queryset, data) + except TypeError: + # Catch any error caused by invalid initial data passed from the user + self.queryset = self.queryset.none() else: self.queryset = self.queryset.none() @@ -658,17 +654,6 @@ class DynamicModelMultipleChoiceField(DynamicModelChoiceMixin, forms.ModelMultip filter = django_filters.ModelMultipleChoiceFilter widget = APISelectMultiple - def filter_queryset(self, data): - field_name = getattr(self, 'to_field_name') or 'pk' - # Normalize data to a list - if type(data) not in (list, tuple): - data = [data] - filter = self.filter( - field_name=field_name, - lookup_expr='in' - ) - return filter.filter(self.queryset, data) - class LaxURLField(forms.URLField): """