Просмотр исходного кода

Fixes #13410: Fix rendering of custom choice fields with large numner of choices

Jeremy Stretch 2 лет назад
Родитель
Сommit
f255fe507d

+ 1 - 1
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)
 

+ 18 - 11
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:

+ 2 - 0
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