我有现有的脆皮形式。我想使用 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 下拉列表,它看起来像标准的多选字段。
我将不胜感激任何想法!
参考资料:
这不是上述问题的答案,但我将其作为我实施的原始问题的替代解决方案。
本质上,我通过 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 对象的实际解决方案,我不会接受这个答案。
当出现非常相似的情况时,这就是有效的方法, 这是代码
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 }}