From 7902c4fc4efb44fa230fb1dd75008805d21027cf Mon Sep 17 00:00:00 2001 From: Herculino Trotta Date: Sun, 8 Nov 2026 02:26:40 -0300 Subject: [PATCH] fix(forms): resolve dynamic select values from the form's queryset A value the default manager hides, such as another user's object already set on a shared record, was taken as a new name and created a duplicate named after its id. --- app/apps/common/fields/forms/dynamic_select.py | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/app/apps/common/fields/forms/dynamic_select.py b/app/apps/common/fields/forms/dynamic_select.py index 3a49517a..4259c542 100644 --- a/app/apps/common/fields/forms/dynamic_select.py +++ b/app/apps/common/fields/forms/dynamic_select.py @@ -21,11 +21,19 @@ class DynamicModelChoiceField(forms.ModelChoiceField): super().__init__(queryset=self.queryset, *args, **kwargs) self._created_instance = None + def _get(self, **lookup): + # The form's queryset may hold choices the default manager hides, like + # another user's object already set on a shared record + try: + return self.queryset.get(**lookup) + except self.model.DoesNotExist: + return self.model.objects.get(**lookup) + def to_python(self, value): if value in self.empty_values: return None try: - return self.model.objects.get(**{self.to_field_name: value}) + return self._get(**{self.to_field_name: value}) except (ValueError, TypeError, self.model.DoesNotExist): return value # Return the raw value; we'll handle creation in clean() @@ -49,7 +57,7 @@ class DynamicModelChoiceField(forms.ModelChoiceField): try: if value.isdigit(): - return self.model.objects.get(id=value) + return self._get(id=value) else: raise self.model.DoesNotExist except self.model.DoesNotExist: