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
相关产品推荐
相关产品推荐

