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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 10:48:15