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

Flask员工日历项目中Jinja模板内SQL关联数据的if条件判断失效问题求助

Flask员工日历项目中Jinja模板内SQL关联数据的if条件判断失效问题求助

嗨,我来帮你排查下问题!你的核心问题出在数据结构的嵌套关系没处理对,还有模板里的遍历逻辑不匹配后端传过来的数据结构,具体来说:

1. 问题根源:数据结构不匹配

你在后端构建的vagthvemhvornår是一个嵌套列表:每个元素对应一个员工的所有排班(是一个列表,因为query_db返回的是多条数据的列表),比如实际结构是:

[
  [{'empid':1, 'weekday':0, ...}, {'empid':1, 'weekday':1, ...}],  # 员工1的所有排班
  [{'empid':2, 'weekday':0, ...}]  # 员工2的所有排班
]

但你在模板里直接用vagter[loop.index0]['weekday'],相当于对整个员工的排班列表取weekday属性——列表本身没有这个键,所以判断自然不会生效,甚至可能因为Flask模板默认静默跳过错误,导致你看不到问题原因。

2. 完整解决步骤

第一步:优化后端数据结构(推荐)

与其传两个分开的列表name和vagter,不如把员工和对应的排班整合成一个字典列表,这样逻辑更清晰,不容易出错:

@app.route("/", methods=["GET", "POST"])
def index():
    # 改成直接构建员工+排班的字典列表
    employees = []
    for user in query_db('select empid, empname from emp'):   
        # 优化SQL:不需要JOIN emp(已经通过empid过滤当前员工),也不要重复查empid
        vagter = query_db(
            'SELECT weekday, day FROM shifts WHERE shifts.empid = ?', 
            [user['empid']]
        )
        employees.append({
            'name': user['empname'],
            'shifts': vagter
        })
    
    # 打印验证结构(可选)
    for emp in employees:
        print(f"员工:{emp['name']},排班:{[dict(s) for s in emp['shifts']]}")

    if request.method == "GET":
        return render_template("index.html", employees=employees)
    
    if request.method == "POST":
        return render_template("test.html")

另外注意:你原来的SQL里写了SELECT shifts.empid, shifts.empid, weekday, day——这里重复了两次shifts.empid,完全没必要,已经通过WHERE条件过滤了当前员工,直接查需要的字段即可。

第二步:修改Jinja模板的遍历逻辑

现在后端传的是employees字典列表,模板里可以直接嵌套遍历员工和他们的排班,然后判断weekday:

{% for emp in employees %}
    <div class="row g-2 ">
      <div class="col-md-1">
        <div class="dates responsivetext">{{ emp.name }}</div>
      </div>
      <!-- 遍历该员工的所有排班 -->
      {% for shift in emp.shifts %}
          <!-- 直接判断单个排班的weekday值 -->
          {% if shift.weekday == 0 %}
          <div class="col-md-1">
            <div class="cliente responsivetext">vagt</div>
          </div>
          {% endif %}
      {% endfor %}
    </div>
{% endfor %}

3. 临时修复方案(不想重构后端的话)

如果你暂时不想调整后端结构,那模板里需要先拿到当前员工的排班列表,再遍历每个排班:

{% for nam in name %}
    <div class="row g-2 ">
      <div class="col-md-1">
        <div class="dates responsivetext">{{ nam }}</div>
      </div>
      <!-- 先获取当前员工的所有排班列表 -->
      {% set employee_shifts = vagter[loop.index0] %}
      <!-- 遍历每个排班条目 -->
      {% for shift in employee_shifts %}
          {% if shift['weekday'] == 0 %}
          <div class="col-md-1">
            <div class="cliente responsivetext">vagt</div>
          </div>
          {% endif %}
      {% endfor %}
    </div>
{% endfor %}

额外小提示

开启Flask的调试模式,这样模板里的错误会直接显示在页面上,方便快速排查:

if __name__ == "__main__":
    app.run(debug=True)

这样修改后,你的if判断应该就能正常触发了!

备注:内容来源于stack exchange,提问作者user29400796

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.13 19:08:02