我使用了以下解决方案。更多链接AutoResponseView
从 django-select2 覆盖 AutoResponseView。在response_obj 中,将“id”值设置为您要使用的模型字段。在我的情况下是 obj.name (而不是 obj.pk 在 AutoResponseView 本身)
在我的应用程序内的新文件select2_classes.py
class MyResponseView(AutoResponseView):
def get(self, request, *args, **kwargs):
self.widget = self.get_widget_or_404()
self.term = kwargs.get("term", request.GET.get("term", ""))
self.object_list = self.get_queryset()
context = self.get_context_data()
response_obj = {
"results": [
{"text": self.widget.label_from_instance(obj), "id": obj.name}
for obj in context["object_list"]
],
"more": context["page_obj"].has_next(),
}
response = JsonResponse(response_obj)
return response
在 app 文件夹内的 urls.py 中
urlpatterns = [
...,
path('my_search/', MyResponseView.as_view(), name='my-search'),
]
在forms.py中,为对应的字段添加了一个widget
from django.urls import reverse_lazy
class MyWidget(ModelSelect2MultipleTagWidget):
attributes = {'data-minimum-input-length': 0}
def get_queryset(self):
return MyModel.objects.all() # or filtered queryset
class ListSearchForm(forms.Form):
name = forms.CharField(
label=...,
help_text=...,
widget=MyWidget(data_url=reverse_lazy("app:my-search")))