You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django下拉菜单多选实现及Select2选中数据的模型保存方法

解决Django多用户选择及保存问题

首先明确核心问题:你的apostols字段用的是ForeignKey,只能关联单个用户,要实现多选必须先修改字段类型为ManyToManyField,之后再配合Select2完成保存逻辑。

1. 修改模型字段

把原ForeignKey替换为ManyToManyField,这样才能存储多个用户关联:

class at(models.Model):
    # ... 其他无关字段
    apostols = models.ManyToManyField(
        settings.AUTH_USER_MODEL,
        related_name='apostols',
        blank=True  # 允许不选择任何用户时可填
    )
    # ... 其他无关字段

修改后执行数据库迁移:

python manage.py makemigrations
python manage.py migrate

2. 调整表单配置

更新表单,使用支持多选的SelectMultiple组件,并添加Select2的样式类:

class AtCreateForm(forms.ModelForm):
    class Meta:
        model = at
        fields = ['apostols']
        widgets = {
            'apostols': forms.SelectMultiple(
                attrs={
                    'class': 'form-control select2',
                    'multiple': 'multiple',
                    'data-placeholder': '选择用户...'
                }
            )
        }

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.fields['apostols'].queryset = User.objects.all()

3. 优化模板渲染

直接通过表单渲染字段,无需手动写input和datalist,同时初始化Select2:

<form method="post">
    {% csrf_token %}
    {{ form.apostols }}
    <input type="submit" value="Submit">
</form>

<script>
    $(document).ready(function() {
        $('.select2').select2({
            tags: false,  // 仅允许选择现有用户,禁止自定义输入
            width: '100%'
        });
    });
</script>

4. 视图中处理保存

ModelForm会自动处理ManyToManyField的关联保存,直接按常规表单逻辑处理即可:

def create_at(request):
    if request.method == 'POST':
        form = AtCreateForm(request.POST)
        if form.is_valid():
            # 保存实例,同时自动关联选中的多个用户
            at_instance = form.save()
            return redirect('你的跳转URL')
    else:
        form = AtCreateForm()
    return render(request, '对应模板路径.html', {'form': form})

内容的提问来源于stack exchange,提问作者kurac

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 09:35:32