Fixed #32993 -- Added AutocompleteJsonView.serialize_result() to allow customization.

This commit is contained in:
Mart Sõmermaa 2021-08-07 19:28:30 +03:00 committed by Mariusz Felisiak
parent b64db05b9c
commit 9b1158a7e0
3 changed files with 35 additions and 3 deletions

View File

@ -610,7 +610,7 @@ answer newbie questions, and generally made Django that much better:
Martin Mahner <https://www.mahner.org/> Martin Mahner <https://www.mahner.org/>
Martin Maney <http://www.chipy.org/Martin_Maney> Martin Maney <http://www.chipy.org/Martin_Maney>
Martin von Gagern <gagern@google.com> Martin von Gagern <gagern@google.com>
Mart Sõmermaa <http://mrts.pri.ee/> Mart Sõmermaa <https://github.com/mrts>
Marty Alchin <gulopine@gamemusic.org> Marty Alchin <gulopine@gamemusic.org>
Masashi Shibata <m.shibata1020@gmail.com> Masashi Shibata <m.shibata1020@gmail.com>
masonsimon+django@gmail.com masonsimon+django@gmail.com

View File

@ -11,7 +11,8 @@ class AutocompleteJsonView(BaseListView):
def get(self, request, *args, **kwargs): def get(self, request, *args, **kwargs):
""" """
Return a JsonResponse with search results of the form: Return a JsonResponse with search results as defined in
serialize_result(), by default:
{ {
results: [{id: "123" text: "foo"}], results: [{id: "123" text: "foo"}],
pagination: {more: true} pagination: {more: true}
@ -26,12 +27,19 @@ class AutocompleteJsonView(BaseListView):
context = self.get_context_data() context = self.get_context_data()
return JsonResponse({ return JsonResponse({
'results': [ 'results': [
{'id': str(getattr(obj, to_field_name)), 'text': str(obj)} self.serialize_result(obj, to_field_name)
for obj in context['object_list'] for obj in context['object_list']
], ],
'pagination': {'more': context['page_obj'].has_next()}, 'pagination': {'more': context['page_obj'].has_next()},
}) })
def serialize_result(self, obj, to_field_name):
"""
Convert the provided model object to a dictionary that is added to the
results list.
"""
return {'id': str(getattr(obj, to_field_name)), 'text': str(obj)}
def get_paginator(self, *args, **kwargs): def get_paginator(self, *args, **kwargs):
"""Use the ModelAdmin's paginator.""" """Use the ModelAdmin's paginator."""
return self.model_admin.get_paginator(self.request, *args, **kwargs) return self.model_admin.get_paginator(self.request, *args, **kwargs)

View File

@ -1,3 +1,4 @@
import datetime
import json import json
from contextlib import contextmanager from contextlib import contextmanager
@ -293,6 +294,29 @@ class AutocompleteJsonViewTests(AdminViewBasicTestCase):
'pagination': {'more': False}, 'pagination': {'more': False},
}) })
def test_serialize_result(self):
class AutocompleteJsonSerializeResultView(AutocompleteJsonView):
def serialize_result(self, obj, to_field_name):
return {
**super().serialize_result(obj, to_field_name),
'posted': str(obj.posted),
}
Question.objects.create(question='Question 1', posted=datetime.date(2021, 8, 9))
Question.objects.create(question='Question 2', posted=datetime.date(2021, 8, 7))
request = self.factory.get(self.url, {'term': 'question', **self.opts})
request.user = self.superuser
response = AutocompleteJsonSerializeResultView.as_view(**self.as_view_args)(request)
self.assertEqual(response.status_code, 200)
data = json.loads(response.content.decode('utf-8'))
self.assertEqual(data, {
'results': [
{'id': str(q.pk), 'text': q.question, 'posted': str(q.posted)}
for q in Question.objects.order_by('-posted')
],
'pagination': {'more': False},
})
@override_settings(ROOT_URLCONF='admin_views.urls') @override_settings(ROOT_URLCONF='admin_views.urls')
class SeleniumTests(AdminSeleniumTestCase): class SeleniumTests(AdminSeleniumTestCase):