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
相关产品推荐
相关产品推荐

