Django如何获取循环生成的HTML Select选项值?
解决Django中循环生成的评分选框取值问题
你的问题核心是所有下拉选框的name属性完全相同,提交后后端只能获取到最后一个选框的值。要解决这个问题,只需要让每个选框的name带上乐队的唯一标识(比如数据库ID),就能对应到具体乐队的评分。
步骤1:修改模板中的select标签
把原来固定的name="thursday_apex"改成包含乐队唯一标识的形式,比如用乐队的id:
{% for band in thursday_apex %} <li> {{ band.band_name }} <select name="thursday_apex_{{ band.id }}"> <option value="0">Didn't watch</option> <option value="1">1</option> <option value="2">2</option> <option value="3">3</option> <option value="4">4</option> <option value="5">5</option> <option value="6">6</option> <option value="7">7</option> <option value="8">8</option> <option value="9">9</option> <option value="10">10</option> </select> </li> {% endfor %}
也可以用数组式命名,让后端直接拿到字典结构,写法更简洁:
<select name="thursday_apex[{{ band.id }}]">
步骤2:在views.py中获取对应评分
方式1:遍历已知乐队列表匹配
如果已经知道本次页面渲染的thursday_apex乐队列表,直接遍历每个乐队,从POST中取出对应值即可:
def your_view(request): if request.method == 'POST': # 假设thursday_apex是你传入模板的乐队查询集 for band in thursday_apex: # 对应第一种name命名方式 score = request.POST.get(f'thursday_apex_{band.id}') # 对应数组式命名方式的写法 # score = request.POST.get(f'thursday_apex[{band.id}]') if score is not None: # 这里添加评分处理逻辑,比如保存到数据库 print(f"乐队{band.band_name}的评分:{score}") # 其他视图逻辑...
方式2:直接遍历POST相关字段
如果不确定当前页面的乐队列表,也可以直接筛选POST中目标前缀的字段:
def your_view(request): if request.method == 'POST': for key, value in request.POST.items(): if key.startswith('thursday_apex_'): # 提取乐队ID band_id = key.split('_')[-1] # 根据ID查询对应乐队 band = Band.objects.get(id=band_id) print(f"乐队{band.band_name}的评分:{value}") # 其他视图逻辑...
注意事项
- 确保乐队的
id是唯一值,这是Django模型的默认配置,无需额外设置。 - 数组式命名的方式在Django中会自动整理成类字典结构,取值更符合直觉,推荐使用。
内容的提问来源于stack exchange,提问作者Wishmaster
相关产品推荐
相关产品推荐

