Python Flask jinja2 Шаблонирование вложенных данных mongodb Объект Cursor - PullRequest
0 голосов
/ 02 мая 2019

Обычно я делал много раз без проблем, но теперь все по-другому, и я не знаю почему.

Я просто пытаюсь отобразить список на html-странице, используя Flask и Jinja2.

А вот мой кусок кода.

__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 ]

1 голос
/ 02 мая 2019

Проблема не в jinja2, а в том, как вы манипулируете результатом вашего запроса.pymongo Метод find возвращает объект типа Cursor, который ведет себя как итератор, а именно, если вы его один раз используете, он исчерпан и вы не можете повторить его снова. Этот ответ может помочь вам понять, как работает тип Cursor.Чтобы это работало, просто конвертируйте результаты запроса в list:

portfolio = list(mongo.db.users.find({"agentid": session['userid']}, {"portfolio": 1}))

0 голосов
/ 06 мая 2019

Я только что выяснил, что в некоторых документах из db отсутствует атрибуция, например:

портфолио отсутствует, а также учетные записи emtpy.

{'_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)

Спасибо за вашу поддержку

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...