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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 23:28:13