diff --git a/netbox/utilities/forms/utils.py b/netbox/utilities/forms/utils.py index b8985c6b06..f74d948043 100644 --- a/netbox/utilities/forms/utils.py +++ b/netbox/utilities/forms/utils.py @@ -1,7 +1,8 @@ import re from django import forms -from django.forms.models import fields_for_model +from django.forms import MultipleChoiceField +from django.forms.models import fields_for_model, ModelMultipleChoiceField from django.utils.translation import gettext as _ from utilities.choices import unpack_grouped_choices @@ -139,7 +140,16 @@ def get_field_value(form, field_name): if form.is_bound and field_name in form.data: if (value := form.data[field_name]) is None: return - if hasattr(field, 'valid_value') and field.valid_value(value): + if isinstance(field, (MultipleChoiceField, ModelMultipleChoiceField)) and isinstance(value, (list, tuple)): + values = [] + for v in value: + if hasattr(field, 'valid_value') and field.valid_value(v): + values.append(v) + + if values: + return values + + elif hasattr(field, 'valid_value') and field.valid_value(value): return value return form.get_initial_for_field(field, field_name) diff --git a/netbox/utilities/tests/test_forms.py b/netbox/utilities/tests/test_forms.py index 8ec1404d5f..768663665b 100644 --- a/netbox/utilities/tests/test_forms.py +++ b/netbox/utilities/tests/test_forms.py @@ -448,3 +448,30 @@ def test_bound_null_with_initial(self): get_field_value(form, 'site'), None ) + + +class MultipleGetFieldValueTest(GetFieldValueTest): + @classmethod + def setUpTestData(cls): + super().setUpTestData() + + class TestForm(forms.Form): + site = forms.ModelMultipleChoiceField( + queryset=Site.objects.all(), + required=False + ) + cls.form_class = TestForm + + def test_bound_with_list_without_initial(self): + form = self.form_class({'site': (self.sites[0].pk, self.sites[1].pk)}, initial={'site': None}) + self.assertEqual( + get_field_value(form, 'site'), + [self.sites[0].pk, self.sites[1].pk] + ) + + def test_bound_with_list_with_initial(self): + form = self.form_class({'site': (self.sites[0].pk, self.sites[1].pk)}, initial={'site': self.sites[0]}) + self.assertEqual( + get_field_value(form, 'site'), + [self.sites[0].pk, self.sites[1].pk] + )