From 16e88b15723a0c251d2774b1e5701aca2f60244d Mon Sep 17 00:00:00 2001 From: David Friederich Date: Wed, 3 Dec 2025 23:36:15 +0100 Subject: [PATCH 1/2] fix: Actually paginate autocomplete JSON response --- src/unfold/views.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/unfold/views.py b/src/unfold/views.py index a7278336..c9452f60 100644 --- a/src/unfold/views.py +++ b/src/unfold/views.py @@ -101,7 +101,7 @@ def get(self, request: HttpRequest, *args: Any, **kwargs: Any) -> JsonResponse: "id": obj.pk, "text": str(obj), } - for obj in self.object_list + for obj in context["page_obj"] ], "pagination": { "more": context["page_obj"].has_next(), From 1df2702ba42ebcc822460ad652089b092e8b6b83 Mon Sep 17 00:00:00 2001 From: David Friederich Date: Thu, 4 Dec 2025 04:08:04 +0100 Subject: [PATCH 2/2] docs: Explain common footguns with lazy modelchoice fields --- docs/fields/autocomplete.md | 30 +++++++++++++++++++++++++++--- 1 file changed, 27 insertions(+), 3 deletions(-) diff --git a/docs/fields/autocomplete.md b/docs/fields/autocomplete.md index 42fc3d2c..758ba0e0 100644 --- a/docs/fields/autocomplete.md +++ b/docs/fields/autocomplete.md @@ -65,14 +65,38 @@ class MyModelAdmin(ModelAdmin): class MyForm(forms.Form): one_object = UnfoldAdminAutocompleteModelChoiceField( label=_("Object - Single value"), - # Important for validation. Make sure it offers same results as the custom view - queryset=MyModel.objects.all(), + # Create here a limited queryset to avoid having to render all results at once + queryset=MyModel.objects.all()[0:20], # Map autocomplete results to the custom view url_path="admin:custom_autocomplete_path_name", ) multiple_objects = UnfoldAdminMultipleAutocompleteModelChoiceField( label=_("Objects - Multiple values"), - queryset=MyModel.objects.all(), + # Create here a limited queryset to avoid having to render all results at once + queryset=MyModel.objects.all()[0:20], url_path="admin:custon_autocomplete_path_name", ) + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + + # In case the form contains initial values, you want to add these to the queryset + if self.initial.get("one_object"): + self.fields["one_object"].queryset = self.fields["one_object"].queryset.filter( + pk=self.initial.get("one_object") + ) + if self.initial.get("multiple_objects"): + self.fields["multiple_objects"].queryset = self.fields["multiple_objects"].queryset.filter( + pk__in=self.initial.get("multiple_objects") + ) + + + # Important - Validate the queryset when the form is submitted + if request.method == "POST": + self.fields["one_object"].queryset = MyModel.objects.filter( + pk__in=request.POST.getlist("one_object") + ) + self.fields["multiple_objects"].queryset = MyModel.objects.filter( + pk__in=request.POST.getlist("multiple_objects") + ) ```