【问题标题】:How to send the text in django-select2 field instead of the id at form submission?如何在 django-select2 字段中发送文本而不是表单提交时的 id?
【发布时间】:2022-10-21 03:59:08
【问题描述】:

这是一个两部分的问题

问题描述
我有一个使用 ModelSelect2TagWidget (接受自由文本作为输入)的字段的表单。当用户以自由文本形式输入数字时,它会转换为 id 是作为自由文本输入的数字的对象。例如,如果用户输入“11”作为自由文本

并提交表单,该条目自动转换为数据库中id为11的值

另一方面,如果用户选择了一个可用选项(不是自由文本),则 select2 字段中所选选项的 id 将在请求中发送,如屏幕截图所示。

问题是提交表单时,我无法区分提交的值是用户输入的 id 还是自由文本数字。

为了解决这个问题,我正在考虑发送输入字段的文本而不是 id 如下

  1. 如何发送所选选项的文本而不是请求中的 id?
  2. 由于这是一个 ModelSelect2TagWidget 字段,它接受自由文本。是否有更好的方法来区分所选选项的 id 或用户是否输入数字作为自由文本?

    谢谢您的帮助!

【问题讨论】:

  • 我也遇到同样的问题,请问您找到解决方案了吗?

标签: django django-select2


【解决方案1】:

我使用了以下解决方案。更多链接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")))

【讨论】:

    猜你喜欢
    • 2015-02-03
    • 1970-01-01
    • 2014-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多