Flask中基于PostgreSQL双查询构建带文件链接的Jinja2动态表格
我明白你的问题所在了——你现在用了嵌套循环,这会让value2里的每一行都和value11里的所有条目配对,导致表格生成了大量重复行,而不是每行对应一个文件链接。咱们来修正这个问题:
核心问题分析
嵌套循环{% for row in value2%}套{% for plik in value11 %}会让每一条value2数据都重复生成len(value11)次表格行,这显然和你“一行数据对应一个XML链接”的需求不符。我们需要让两组数据一一对应循环。
解决方案
假设value2和data11(你生成XML的数据源)的行数完全一致,我们可以用两种方式实现正确的动态表格:
方案1:用zip过滤器配对两组数据
直接在Jinja2中把value2和value11的元素一一绑定循环:
<table class="table table-striped table-bordered" id="czyodramke" width="100%" data-name="mytable"> <thead> <tr> <th onclick="sortTable(0, 'xxx')">aaa</th> <th onclick="sortTable(1, 'xxx')">bbb</th> <th onclick="sortTable(2, 'xxx')">ccc</th> <th onclick="sortTable(3, 'xxx')">ddd</th> <th onclick="sortTable(4, 'xxx')">eee</th> <th onclick="sortTable(5, 'xxx')">fff</th> <th>Plik XML</th> <!-- 给最后一列添加表头 --> </tr> </thead> <tbody> {% for row, plik in value2|zip(value11) %} <tr> <td>{{row[0]}}</td> <td>{{row[1]}}</td> <td>{{row[2]}}</td> <td>{{row[3]}}</td> <td>{{row[4]}}</td> <td>{{row[5]}}</td> <td> <!-- 用a标签替代form,更简洁直观 --> <a href="{{ url_for('static', filename=plik|string ~ '.xml') }}" target="_blank" class="btn btn-primary">pokaz plikl</a> </td> </tr> {% endfor %} </tbody> </table>
方案2:用循环索引直接匹配(更简洁)
因为你生成的XML文件名是按0.xml、1.xml...顺序命名的,我们可以直接用Jinja2循环自带的loop.index0(从0开始的索引)来构建文件路径,甚至可以不用传value11到前端:
<table class="table table-striped table-bordered" id="czyodramke" width="100%" data-name="mytable"> <thead> <tr> <th onclick="sortTable(0, 'xxx')">aaa</th> <th onclick="sortTable(1, 'xxx')">bbb</th> <th onclick="sortTable(2, 'xxx')">ccc</th> <th onclick="sortTable(3, 'xxx')">ddd</th> <th onclick="sortTable(4, 'xxx')">eee</th> <th onclick="sortTable(5, 'xxx')">fff</th> <th>Plik XML</th> </tr> </thead> <tbody> {% for row in value2 %} <tr> <td>{{row[0]}}</td> <td>{{row[1]}}</td> <td>{{row[2]}}</td> <td>{{row[3]}}</td> <td>{{row[4]}}</td> <td>{{row[5]}}</td> <td> <a href="{{ url_for('static', filename=loop.index0|string ~ '.xml') }}" target="_blank" class="btn btn-primary">pokaz plikl</a> </td> </tr> {% endfor %} </tbody> </table>
对应的后端代码可以简化(不需要生成lst):
# 执行第一个查询获取表格数据 cursor.execute(sql_query) data2 = cursor.fetchall() # 执行第二个查询获取XML内容(这里你原来的代码可能漏了第二个execute?) cursor.execute(sql_query11) data11 = cursor.fetchall() # 生成XML文件 for i in range(len(data11)): naszplik = ''.join(data11[i]) with open(f"project/static/{i}.xml", "w", encoding="utf-8") as f: f.write(naszplik) # 只需要传data2到前端即可 return render_template('wyniki.html', value2=data2)
注意事项
- 确保
value2和data11的行数完全一致,否则会出现数据和文件不匹配的情况; - 如果后续XML文件名规则有变化,记得同步修改前端的路径拼接逻辑。
内容的提问来源于stack exchange,提问作者moro
相关产品推荐
相关产品推荐

