如何在 django 脆皮表单中使用 select2 多重选择?

问题描述 投票:0回答:2

我有现有的脆皮形式。我想使用 django-select2 将现有的多选替换为最多有两个选择的 Select2 字段。我从这篇文章知道我需要包含“data-maximum-selection-length”作为小部件属性。

这是我添加的字段代码:

forms.ModelMultipleChoiceField(
required=True, 
queryset=MyModel.objects.all(), 
widget=s2forms.Select2MultipleWidget(attrs={'data-maximum-selection-length': 2}))

我在模板的头部包含了 {{ form.media.css }} ,在标签之前包含了 {{ form.media.js }} 。编辑:我的 urls.py 中包含

path('select2/', include('django_select2.urls')),

该字段的格式未设置为显示为 select2 下拉列表,它看起来像标准的多选字段。

这就是我希望获得的: ...它看起来是这样的:

我将不胜感激任何想法!

参考资料:

python-3.x django jquery-select2 django-crispy-forms django-select2
2个回答
0
投票

这不是上述问题的答案,但我将其作为我实施的原始问题的替代解决方案。

本质上,我通过 HTML 作为字段集注入我需要的 Select2 字段,从而回避了脆脆的表单问题。


model_ids = [str(ModelObject.id) for obj in ModelInput]
model_ids_string = "".join([f'<option value={model_id}>{model_id}</option>' for model_id in model_ids])

my_fieldset = Fieldset(
    f"""
       <div class="controls">
       <select id="field_name" name="field_name" required 
       class="js-states form-control" style="width:100;" multiple>
       {model_ids_string}
       </select>
       </div>""")
dyn_field_set.append(my_fieldset)

如果有人有一个仍然按预期使用 Select2 对象的实际解决方案,我不会接受这个答案。


0
投票

当出现非常相似的情况时,这就是有效的方法, 这是代码

views.py

from django_select2.forms import Select2MultipleWidget
class VendorUpdateForm(forms.ModelForm):
   names = forms.ModelMultipleChoiceField(
        queryset=User.objects.filter(is_active=True),
        widget=Select2MultipleWidget(attrs={'data-maximum-selection- 
        length': 2}),
        required=False,
)
    def __init__(self, *args, **kwargs):
        super(VendorUpdateForm, self).__init__(*args, **kwargs)
        self.helper = FormHelper()
        self.helper.add_input(Submit('submit', 'Submit', css_class='btn- 
         dark'))
        self.helper.form_method = 'POST'

然后在 Django 模板中包含 select2 正常工作所需的 js

<script src="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.13/js/select2.min.js"></script>

{{ form.media.js }}
© www.soinside.com 2019 - 2024. All rights reserved.