Django表单提交匹配指定名称后无法删除All_Name模型对象如何解决
错误原因
- 你尝试调用
delete()的对象是字符串类型的表单值,并非All_Name的模型实例或查询集,只有Django ORM的模型实例/查询集才支持调用delete()执行数据库删除操作。 - 你最初通过
values_list()获取的是字符串值组成的查询集,不包含模型实例信息,因此无法直接调用delete()方法,系统会抛出对应的报错。 - 原有代码的分支逻辑存在漏洞:仅当
name不匹配时才执行跳转,匹配成功的分支走完删除逻辑后会继续执行下方的模板渲染逻辑,不符合表单提交后的常规交互逻辑。
修正代码
views.py
def new_blog_post(request): if request.method == 'POST': form = PostForm(data=request.POST) if form.is_valid(): formName = form.cleaned_data['name'] new_post = form.save(commit=False) # 先保存提交的BlogPost记录,如果你需要仅当name匹配时才保存可以调整这行的位置 new_post.save() # 查询匹配的All_Name记录,存在则删除 All_Name.objects.filter(names=formName).delete() # 表单处理完成后统一跳转 return redirect('home') else: form = PostForm() context = {'form':form} return render(request, 'new_blog_post.html', context)
代码说明
- 去掉了全量拉取所有
All_Name记录的操作,直接按需过滤匹配的记录执行删除,数据量较大时性能更优 - 直接调用查询集的
delete()方法,会自动删除所有names字段等于表单提交值的All_Name记录,不需要额外判断是否存在,没有匹配记录时不会执行任何操作也不会报错 - 调整了跳转逻辑,所有表单提交处理完成后都统一跳转,避免重复提交表单的问题
内容的提问来源于stack exchange,提问作者user16860615
相关产品推荐
相关产品推荐

