Update get_field_value to handle multiple incoming values

This commit is contained in:
Daniel Sheppard 2025-04-14 20:51:05 -05:00
parent 8aacef60a3
commit 462839836c
2 changed files with 39 additions and 2 deletions

View File

@ -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)

View File

@ -448,3 +448,30 @@ class GetFieldValueTest(TestCase):
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]
)