通常,我做了很多次都没问题,但是现在不一样了,我也不知道为什么。
我只是想使用Flask和Jinja2在html页面上显示列表。
这是我的代码。
__init__.py
bpPortfolioList = Blueprint('portfolio', __name__)
@bpPortfolioList.route('/list', methods=['GET', 'POST'])
@is_log_in
def plist():
portfolio = None
if session['profile'] == 1:
print('agent')
portfolio = mongo.db.users.find({"agentid": session['userid']}, {"portfolio": 1})
for p in portfolio:
print(p)
return render_template('portfolio/list.html', portfolios=portfolio)
我已经掌握了投资组合的输出,这是结果:
{'_id': 10, 'portfolio': {'id': 8476, 'description': '', 'mode': 'Closed', 'accounts': [{'id': 123456, 'account_type': 'None', 'category': '1', 'owner': None, 'ratio': 100, 'status': '1'}]}}
{'_id': 1}
{'_id': 11, 'portfolio': {'id': 4983, 'description': '', 'mode': 'Closed', 'accounts': []}}
{'_id': 13, 'portfolio': {'id': 1226, 'description': '', 'mode': 'Closed', 'accounts': []}}
{'_id': 15, 'portfolio': {'id': 8786, 'description': '', 'mode': 'Closed', 'accounts': []}}
{'_id': 19, 'portfolio': {'id': 7995, 'description': '', 'mode': 'Closed', 'accounts': []}}
然后是HTML:
<tbody>
{% for p in portfolios %}
<tr>
<td>{{ p.id }}</td>
<td>{{ p.mode }}</td>
{% for c in p.accounts %}
<td>{{ c.id }}</td>
<td>{{ c.status }}</td>
<td>{{ c.ratio }}</td>
{% endfor %}
</tr>
{% endfor %}
</tbody>
结果,除了表头之外,我什么也没得到
有什么问题吗?
感谢您的帮助。
答案 0 :(得分:1)
问题不在于jinja2
,而是问题在于您处理查询结果的方式。 pymongo
的{{1}}方法返回类型为find
的对象,该对象的行为类似于迭代器,即,一旦使用一次,它就被耗尽,无法再次迭代。 This answer可以帮助您了解Cursor
类型的工作方式。因此,要使其正常工作,只需将查询结果转换为Cursor
:
list
答案 1 :(得分:0)
我只是发现db中的某些文档缺少属性,例如:
资产组合丢失,并且帐户为空。
{'_id': 10, 'portfolio': {'id': 8476, 'description': '', 'mode': 'Closed', 'accounts': [{'id': 123456, 'account_type': 'None', 'category': '1', 'owner': None, 'ratio': 100, 'status': '1'}]}}
**{'_id': 1}**
{'_id': 11, 'portfolio': {'id': 4983, 'description': '', 'mode': 'Closed', 'accounts': []}}
通过添加以下代码,它解决了我的问题:
new_pf = []
for p in pf:
if 'portfolio' in p:
if 'accounts' in p['portfolio'] and p['portfolio']['accounts']:
new_pf.append(p)
感谢您的支持