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

