From 078231a46be1bef634864f4ead48c8b96d4526cf Mon Sep 17 00:00:00 2001 From: Jason Novinger Date: Mon, 24 Nov 2025 12:20:53 -0600 Subject: [PATCH] Enables filter modifiers on APISelect based fields --- netbox/utilities/forms/mixins.py | 16 ---------------- netbox/utilities/forms/widgets/modifiers.py | 4 ++++ 2 files changed, 4 insertions(+), 16 deletions(-) diff --git a/netbox/utilities/forms/mixins.py b/netbox/utilities/forms/mixins.py index 779199fc8..5d0828a06 100644 --- a/netbox/utilities/forms/mixins.py +++ b/netbox/utilities/forms/mixins.py @@ -8,7 +8,6 @@ from django.utils.translation import gettext_lazy as _ from netbox.registry import registry from utilities.forms.fields import ColorField, QueryField, TagFilterField from utilities.forms.widgets import FilterModifierWidget -from utilities.forms.widgets.apiselect import APISelect from utilities.forms.widgets.modifiers import MODIFIER_EMPTY_FALSE, MODIFIER_EMPTY_TRUE __all__ = ( @@ -211,9 +210,6 @@ class FilterModifierMixin: if isinstance(field, (forms.BooleanField, forms.NullBooleanField)): return [] - if self._is_api_widget_field(field): - return [] - for field_class in field.__class__.__mro__: if field_class in FORM_FIELD_LOOKUPS: return FORM_FIELD_LOOKUPS[field_class] @@ -234,15 +230,3 @@ class FilterModifierMixin: verified_lookups.append((lookup_code, lookup_label)) return verified_lookups - - def _is_api_widget_field(self, field): - """Check if a field uses an API-based widget.""" - if isinstance(field.widget, APISelect): - return True - - if hasattr(field.widget, 'attrs') and field.widget.attrs: - api_attrs = ['data-url', 'data-api-url', 'data-static-params'] - if any(attr in field.widget.attrs for attr in api_attrs): - return True - - return False diff --git a/netbox/utilities/forms/widgets/modifiers.py b/netbox/utilities/forms/widgets/modifiers.py index d3d609734..981c1990a 100644 --- a/netbox/utilities/forms/widgets/modifiers.py +++ b/netbox/utilities/forms/widgets/modifiers.py @@ -86,6 +86,10 @@ class FilterModifierWidget(forms.Widget): The JavaScript initializeFromURL() will set the correct modifier dropdown value based on URL parameters. """ + # Propagate any attrs set on the wrapper (like data-url from get_bound_field) + # to the original widget before rendering + self.original_widget.attrs.update(self.attrs) + # Get context from the original widget original_context = self.original_widget.get_context(name, value, attrs)