From 5c6aaf238806e270a5dce9a2bb1492772a549af8 Mon Sep 17 00:00:00 2001 From: Martin Hauser Date: Wed, 17 Dec 2025 21:32:46 +0100 Subject: [PATCH] Closes #20900: Allow multiple choices in CustomField select filter fields (#20992) --- netbox/extras/models/customfields.py | 12 ++++++++++-- netbox/netbox/forms/base.py | 4 +++- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/netbox/extras/models/customfields.py b/netbox/extras/models/customfields.py index d97691026..898ba6908 100644 --- a/netbox/extras/models/customfields.py +++ b/netbox/extras/models/customfields.py @@ -449,7 +449,14 @@ class CustomField(CloningMixin, ExportTemplatesMixin, ChangeLoggedModel): return model.objects.filter(pk__in=value) return value - def to_form_field(self, set_initial=True, enforce_required=True, enforce_visibility=True, for_csv_import=False): + def to_form_field( + self, + set_initial=True, + enforce_required=True, + enforce_visibility=True, + for_csv_import=False, + for_filterset_form=False, + ): """ Return a form field suitable for setting a CustomField's value for an object. @@ -457,6 +464,7 @@ class CustomField(CloningMixin, ExportTemplatesMixin, ChangeLoggedModel): enforce_required: Honor the value of CustomField.required. Set to False for filtering/bulk editing. enforce_visibility: Honor the value of CustomField.ui_visible. Set to False for filtering. for_csv_import: Return a form field suitable for bulk import of objects in CSV format. + for_filterset_form: Return a form field suitable for use in a FilterSet form. """ initial = self.default if set_initial else None required = self.required if enforce_required else False @@ -519,7 +527,7 @@ class CustomField(CloningMixin, ExportTemplatesMixin, ChangeLoggedModel): field_class = CSVMultipleChoiceField field = field_class(choices=choices, required=required, initial=initial) else: - if self.type == CustomFieldTypeChoices.TYPE_SELECT: + if self.type == CustomFieldTypeChoices.TYPE_SELECT and not for_filterset_form: field_class = DynamicChoiceField widget_class = APISelect else: diff --git a/netbox/netbox/forms/base.py b/netbox/netbox/forms/base.py index 0860ec814..1b22e83f8 100644 --- a/netbox/netbox/forms/base.py +++ b/netbox/netbox/forms/base.py @@ -205,4 +205,6 @@ class NetBoxModelFilterSetForm(CustomFieldsMixin, SavedFiltersMixin, forms.Form) ) def _get_form_field(self, customfield): - return customfield.to_form_field(set_initial=False, enforce_required=False, enforce_visibility=False) + return customfield.to_form_field( + set_initial=False, enforce_required=False, enforce_visibility=False, for_filterset_form=True + )