Django如何获取HTML模板for循环渲染的商品值传递给views.py实现删除功能
Django购物清单删除功能无法获取商品值修复方案
问题根因
你提交的删除表单未携带商品参数,核心问题如下:
<td>属于普通展示标签,不属于表单可提交元素,即使设置name属性也不会被POST请求携带- 循环生成的DOM元素使用了重复id,违反HTML id全局唯一规范,会导致后续DOM操作异常
- 删除表单未添加Django POST请求必填的csrf_token,后续提交会触发403权限错误
- 直接使用商品名称作为删除筛选条件存在重名误删风险,优先使用数据表主键id操作更稳妥
具体修改代码
1. HTML删除表格部分调整
<div> <table> {% for item in items %} <tr> <form action="{% url 'shop_delete' %}" method="post"> {% csrf_token %} <!-- 隐藏input传递商品主键id,完全避免重名问题 --> <input type="hidden" name="product_id" value="{{ item.id }}"> <td>{{ item.product }}</td> <td><button type="submit" name="delete">X</button></td> </form> </tr> {% endfor %} </table> </div>
2. views.py删除逻辑调整
import datetime def shop_delete(request): if request.method == "POST": product_id = request.POST.get("product_id") # 按主键+当前用户筛选,保证只删除当前登录用户的对应商品 Shopping_List.objects.filter(id=product_id, user=request.user).delete() return redirect('shop')
如果你坚持要使用商品名称作为删除条件,可将隐藏input的value改为{{ item.product }},name改为product,删除逻辑中补充当日日期筛选即可:
def shop_delete(request): if request.method == "POST": product = request.POST.get("product") Shopping_List.objects.filter(user=request.user, date=datetime.date.today(), product=product).delete() return redirect('shop')
内容的提问来源于stack exchange,提问作者Nelso
相关产品推荐
相关产品推荐

