Как отправить текст в поле django-select2 вместо id при отправке формы?
Этот вопрос состоит из двух частей
Описание проблемы
У меня есть форма с полем, которое использует ModelSelect2TagWidget (который принимает свободный текст в качестве ввода). когда пользователь вводит число как свободный текст, оно преобразуется в объект, id которого является числом, введенным как свободный текст. Например, если пользователь вводит "11" как свободный текст
.

и форма будет отправлена, запись автоматически преобразуется в значение, id которого в базе данных равен 11
.

С другой стороны, если пользователь выбирает один из доступных вариантов (не свободный текст), то в запрос отправляется id выбранного варианта в поле select2, как показано на скриншоте.

Проблема в том, что когда форма отправляется, у меня нет способа отличить, является ли отправленное значение идентификатором или свободным текстом, введенным пользователем.
Для решения этой проблемы я думаю отправить текст поля ввода вместо id следующим образом

- Как я могу отправить текст выбранного варианта вместо id в запросе?
- Поскольку это поле ModelSelect2TagWidget, оно принимает свободный текст. Есть ли лучший способ различать между id выбранного варианта или если пользователь вводит число как свободный текст? .
Спасибо за помощь!
Я использовал следующее решение. Дополнительные ссылки AutoResponseView
Подкласс AutoResponseView из django-select2. В 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
В urls.py внутри папки app
urlpatterns = [
...,
path('my_search/', MyResponseView.as_view(), name='my-search'),
]
В forms.py добавлен виджет к соответствующему полю
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")))