Django视图如何获取select表单选中值删除指定Player数据
Django下拉表单选中值获取及删除功能修复
你的代码存在3个直接导致功能失效的问题,按下面步骤修改即可:
- 模板中
<option>标签的value属性写死为"1",无论选哪个玩家,提交的参数值永远是1,和实际选中项无关 - 视图中存在拼写错误:将Django的请求对象
request错写为reguest,代码运行会直接抛异常 - 视图取值逻辑错误:POST表单提交的参数存储在
request.POST字典中,需要用select标签定义的name属性值to_delete作为键取值,不是取固定键'1'
第一步:修改HTML模板
不要硬编码option的value值,动态绑定玩家的唯一标识,优先用玩家主键(可避免重名玩家查询出错),如果要按name查询就绑定name字段:
<div> <form method="POST" action = "" enctype="multipart/form-data"> {% csrf_token %} <select name="to_delete" > {% for pl in players %} <!-- 原代码value="1"为硬编码,替换为动态值 --> <option value="{{ pl.pk }}">{{ pl.name }}</option> {% endfor %} </select> <input type="submit" value="Delete"/> </form> </div>
第二步:修改视图函数逻辑
修正拼写错误,从POST参数字典中取出选中值,查询对应玩家对象执行删除,删除后加重定向避免重复提交:
from django.shortcuts import render, redirect def deletePlayer(request,pk,sk): room = Room.objects.get(number=pk) player = Player.objects.get(number=sk) players = Player.objects.filter(room=room) if request.method == "POST": # 从POST参数中取select选中的值,键名和select标签的name属性一致 target_id = request.POST.get('to_delete') # 按主键查询目标玩家,比用name查询更稳定 to_delete = Player.objects.get(pk=target_id) # 如果模板里option绑定的是pl.name,就用下面这行查询 # to_delete = Player.objects.get(name=target_id) to_delete.delete() # 重定向回当前页面,避免用户刷新重复提交删除请求 return redirect(request.path) context = {'room': room, 'players':players,'player':player} return render(request, 'base/delete_player.html', context)
补充说明
- 取POST参数推荐用
get()方法,当参数不存在时会返回None,不会直接抛出键错误导致500异常,后续可以自己加判空逻辑做容错 - 如果玩家存在重名可能,绝对不要用name作为查询条件,用主键是最稳妥的方案
- 所有修改数据的POST请求,处理完成后都要返回重定向响应,这是Web开发的基本实践,避免刷新重复提交
内容的提问来源于stack exchange,提问作者Denis Culic
相关产品推荐
相关产品推荐

