Как отправить текст в поле django-select2 вместо id при отправке формы?

Этот вопрос состоит из двух частей

Описание проблемы
У меня есть форма с полем, которое использует ModelSelect2TagWidget (который принимает свободный текст в качестве ввода). когда пользователь вводит число как свободный текст, оно преобразуется в объект, id которого является числом, введенным как свободный текст. Например, если пользователь вводит "11" как свободный текст
. enter image description here
и форма будет отправлена, запись автоматически преобразуется в значение, id которого в базе данных равен 11
. enter image description here

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

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

Для решения этой проблемы я думаю отправить текст поля ввода вместо id следующим образом
enter image description here

  1. Как я могу отправить текст выбранного варианта вместо id в запросе?
  2. Поскольку это поле ModelSelect2TagWidget, оно принимает свободный текст. Есть ли лучший способ различать между id выбранного варианта или если пользователь вводит число как свободный текст?
  3. .

Спасибо за помощь!

Я использовал следующее решение. Дополнительные ссылки 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")))
Вернуться на верх