python Flask jinja2模板化嵌套的mongodb数据Cursor对象

时间:2019-05-02 01:26:54

标签: python flask jinja2

通常,我做了很多次都没问题,但是现在不一样了,我也不知道为什么。

我只是想使用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>

结果,除了表头之外,我什么也没得到

有什么问题吗?

感谢您的帮助。

2 个答案:

答案 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)

感谢您的支持