如何在HTML中访问Django QuerySet调用values_list返回的所有值?
问题原因
你现有代码的核心问题出在模板的渲染逻辑和标签语法上:
- 内层循环嵌套
<tr>标签,导致每个字段单独生成一行,而非一条记录对应一行 - 行结束标签错误写为
<tr>而非</tr>,浏览器渲染时会识别为无效标签,导致内容无法正常展示
解决方案
1. 后端代码调整(可选)
如果不需要展示每条记录的主键ID,可直接在查询时指定需要返回的字段,避免后续多余处理,且QuerySet本身支持模板遍历,不需要手动转为列表:
selected_user = User.objects.get(username=username) # 按你需要展示的顺序填写对应模型字段名即可 all_mac = selected_user.userl.all().values_list('mac', 'region', 'system', 'ip', 'port') return render(request, "users/showMachines.html", {'machines': all_mac})
2. 模板正确写法
如果后端已经过滤了多余的ID字段,直接用双层循环渲染即可,注意<tr>标签要包在整条记录的外层:
<table border="1"> <!-- 可按需自定义表头 --> <thead> <tr> <th>MAC地址</th> <th>区域</th> <th>系统</th> <th>IP</th> <th>端口</th> </tr> </thead> <tbody> {% for machine in machines %} <tr> {% for field in machine %} <td>{{ field }}</td> {% endfor %} </tr> {% endfor %} </tbody> </table>
如果保留了原查询的ID字段,需要跳过第一个元素,可直接按索引取值:
<tbody> {% for machine in machines %} <tr> <td>{{ machine.1 }}</td> <td>{{ machine.2 }}</td> <td>{{ machine.3 }}</td> <td>{{ machine.4 }}</td> <td>{{ machine.5 }}</td> </tr> {% endfor %} </tbody>
3. 排查验证
如果修改后仍无内容,可先在视图函数中打印查询结果确认数据非空:
print(all_mac)
确认控制台有对应数据输出后,再排查模板路径是否正确、上下文变量名是否和模板中调用的名称一致。
内容的提问来源于stack exchange,提问作者ViperVille
相关产品推荐
相关产品推荐

