From 683ba5eed31f22294a0d9f97408be05d67dba950 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Thu, 9 Jul 2020 16:35:02 -0400 Subject: [PATCH] #4835: Cleanup and improved error handling --- docs/release-notes/version-2.8.md | 2 +- netbox/utilities/forms.py | 29 +++++++---------------------- 2 files changed, 8 insertions(+), 23 deletions(-) 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/utilities/forms.py b/netbox/utilities/forms.py index 9ed0cca5c..539347aaa 100644 --- a/netbox/utilities/forms.py +++ b/netbox/utilities/forms.py @@ -594,16 +594,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) @@ -611,7 +601,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() @@ -641,17 +637,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): """