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

Django如何过滤select中已存入数据库的选项避免重复添加

第一步:修改GruppiForm表单类,支持动态过滤选项

class GruppiForm(forms.ModelForm):
    class Meta:
        model = models.DatiGruppi
        exclude = ['gruppi_scheda']
    
    # 新增初始化方法接收待排除的群组ID列表
    def __init__(self, *args, exclude_gruppo_ids=None, **kwargs):
        super().__init__(*args, **kwargs)
        if exclude_gruppo_ids is None:
            exclude_gruppo_ids = []
        # 过滤下拉选项,排除已经添加过的群组
        self.fields['dati_gruppo'].queryset = self.fields['dati_gruppo'].queryset.exclude(
            id__in=exclude_gruppo_ids
        )

第二步:修改视图函数,传入待排除的ID列表

def creazione(request, nome):
    scheda = get_object_or_404(Schede, nome_scheda = nome)
    # 获取当前scheda已经关联的所有群组ID
    added_gruppo_ids = scheda.gruppi_scheda.values_list('dati_gruppo_id', flat=True)
    if request.method == "POST":
        # POST实例化表单时也传入排除ID,保证表单验证逻辑一致
        gruppo_form = GruppiForm(request.POST, prefix = 'gruppo', exclude_gruppo_ids=added_gruppo_ids)
        if gruppo_form.is_valid():
            gruppo = gruppo_form.save(commit = False)
            gruppo.gruppi_scheda = scheda
            gruppo.save()
            return HttpResponseRedirect(request.path_info)
    else:
        # GET请求初始化表单时传入排除ID,下拉就不会显示已添加的选项
        gruppo_form = GruppiForm(prefix = 'gruppo', exclude_gruppo_ids=added_gruppo_ids)

    context = {'scheda' : scheda, 'gruppo_form' : gruppo_form}
    return render(request, 'crea/passo2.html', context) 

实现逻辑说明

  • 每次加载页面时先查询当前scheda已经添加过的所有群组ID
  • 初始化表单时将这些ID传入,表单会自动从dati_gruppo的下拉选项中过滤对应记录
  • 提交表单时也传入相同的排除列表,可避免用户恶意提交已存在的群组,保证数据逻辑一致性

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 08:15:01