From f255fe507ddc927f23163d386c5fd9cbae25bfc6 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Tue, 8 Aug 2023 09:32:56 -0400 Subject: [PATCH] Fixes #13410: Fix rendering of custom choice fields with large numner of choices --- netbox/extras/api/views.py | 2 +- netbox/extras/models/customfields.py | 29 +++++++++++++++--------- netbox/utilities/forms/fields/dynamic.py | 2 ++ 3 files changed, 21 insertions(+), 12 deletions(-) diff --git a/netbox/extras/api/views.py b/netbox/extras/api/views.py index cfe76a889..06797891e 100644 --- a/netbox/extras/api/views.py +++ b/netbox/extras/api/views.py @@ -80,7 +80,7 @@ class CustomFieldChoiceSetViewSet(NetBoxModelViewSet): # Paginate data if page := self.paginate_queryset(choices): data = [ - {'value': c[0], 'label': c[1]} for c in page + {'id': c[0], 'display': c[1]} for c in page ] return self.get_paginated_response(data) diff --git a/netbox/extras/models/customfields.py b/netbox/extras/models/customfields.py index 515b96225..ac68855a0 100644 --- a/netbox/extras/models/customfields.py +++ b/netbox/extras/models/customfields.py @@ -441,18 +441,25 @@ class CustomField(CloningMixin, ExportTemplatesMixin, ChangeLoggedModel): if set_initial and default_choice: initial = default_choice - if self.type == CustomFieldTypeChoices.TYPE_SELECT: - field_class = CSVChoiceField if for_csv_import else DynamicChoiceField - widget_class = APISelect + if for_csv_import: + if self.type == CustomFieldTypeChoices.TYPE_SELECT: + field_class = CSVChoiceField + else: + field_class = CSVMultipleChoiceField + field = field_class(choices=choices, required=required, initial=initial) else: - field_class = CSVMultipleChoiceField if for_csv_import else DynamicMultipleChoiceField - widget_class = APISelectMultiple - field = field_class( - choices=choices, - required=required, - initial=initial, - widget=widget_class(api_url=f'/api/extras/custom-field-choice-sets/{self.choice_set.pk}/choices/') - ) + if self.type == CustomFieldTypeChoices.TYPE_SELECT: + field_class = DynamicChoiceField + widget_class = APISelect + else: + field_class = DynamicMultipleChoiceField + widget_class = APISelectMultiple + field = field_class( + choices=choices, + required=required, + initial=initial, + widget=widget_class(api_url=f'/api/extras/custom-field-choice-sets/{self.choice_set.pk}/choices/') + ) # URL elif self.type == CustomFieldTypeChoices.TYPE_URL: diff --git a/netbox/utilities/forms/fields/dynamic.py b/netbox/utilities/forms/fields/dynamic.py index 6741ca7ed..94870451d 100644 --- a/netbox/utilities/forms/fields/dynamic.py +++ b/netbox/utilities/forms/fields/dynamic.py @@ -29,6 +29,8 @@ class DynamicChoiceField(forms.ChoiceField): self.choices = [ choice for choice in self.choices if choice[0] == data ] + else: + self.choices = [] return bound_field