loop.index失效时,如何在Jinja2循环中统计符合条件的查询结果?
问题原因
你遇到的问题是loop.index是整个循环的全局索引,会对所有遍历到的项计数——包括那些不满足item[1].id == current_user.id条件被跳过的项,所以最终显示的计数不是符合条件结果的连续序号。
解决方案
有两种常用解决方式,按需选择:
方式一:后端直接过滤推荐
在SQLAlchemy查询阶段就筛选出当前用户的记录,这样循环的每一项都是符合条件的,loop.index就能直接作为正确计数使用,同时减少不必要的数据传输。
修改后的SQLAlchemy代码:
q = session.query( Post, User, Bookmark, ).filter( Post.id == Bookmark.post_id, ).filter( User.id == Bookmark.user_id, ).filter( User.id == current_user.id # 新增过滤条件,只保留当前用户的书签 ).all()
对应的Jinja2代码简化为:
{% for item in q %} {{ loop.index }} {{ item[0].title }} {% endfor %}
方式二:前端局部计数
如果无法修改后端查询,可在Jinja2中用命名空间变量单独统计符合条件的项:
{% set ns = namespace(count=0) %} {% for item in q %} {% if item[1].id == current_user.id %} {% set ns.count = ns.count + 1 %} {{ ns.count }} {{ item[0].title }} {% endif %} {% endfor %}
这里用namespace是因为Jinja2中普通变量在循环内是局部作用域,无法跨迭代保存状态,命名空间可以解决这个问题。
内容的提问来源于stack exchange,提问作者Vadim Popoff
相关产品推荐
相关产品推荐

