修改Flask-SQLAlchemy查询结果
-
21-12-2019 - |
题
我想在将 Flask-sqlalchemy 查询的结果发送到之前修改它们 render_template()
.
视图查询和修改项目:
items = Items.query
for i in items:
date = i.__dict__['date']
i.__dict__['date_modified'] = date.replace('/', '-')
return render_template('index.html', items=items)
当模板输出项目时:
{% for i in items %}{{i.date_modified}}{% endfor %}
此错误显示在调试器中:
KeyError: 'date_modified'
但是,如果我修改初始查询以获取分页对象,则不会引发错误并显示修改日期。
items = Items.query
items = items.paginate(page_num, items_per_page, True).items
for i in items:
date = i.__dict__['date']
i.__dict__['date_modified'] = date.replace('/', '-')
return render_template('index.html', items=items)
查询结果和分页结果有什么区别,后者可以就地操作,而前者不行?如何在不修改分页查询的情况下修改结果?
解决方案
在这两个例子中你都通过了 items
到模板。但是,那 items
每种情况下的值都不同。
在第一个例子中, items
是来自的查询对象 Items.query
. 。该值可以迭代,这就是 for 循环起作用的原因。但这些物品需要永久存放在某个地方。在模板中,查询将再次迭代,并返回未在视图中修改的新 Items 实例。
在第二个例子中, items
是的结果 paginate
, , 的列表 Items
. 。当您修改每个项目时,它仍然存储在列表中,并且在模板中再次迭代它会产生相同的项目。
要解决第一个示例中的错误,您需要存储对返回的项目的引用。最简单的方法是强制查询返回一个列表: items = Items.query.all()
.
不隶属于 StackOverflow