Рендеринг python dict в Jinja2 / Werkzeug

я играю с URL ссылками (основываясь на ближайшее время демо-приложение от сверла).

у меня такой дикт -

    ('1', {'target': 'http://10.58.48.103:5000/', 'clicks': '1'})
    ('3', {'target': 'http://slash.org', 'clicks': '4'})
    ('2', {'target': 'http://10.58.48.58:5000/', 'clicks': '1'})
    ('5', {'target': 'http://de.com/a', 'clicks': '0'})

, который возвращается в url_list и используется render_template

def on_list_urls(self, request):
    url_list = self.get_urls()
    return self.render_template('list_urls.html',
        url_list = url_list
    )

шаблон list_urls довольно прост -

    {% extends "layout.html" %}
    {% block title %}List URLs{% endblock %}
    {% block body %}
      <h2>List URLs</h2>
      <ul id="items">
      {% for item in url_list %}
        <li>{{ item }}</li>
      {% endfor %}
      </ul>

    {% endblock %}

дело в том, что я не могу получить доступ к элементам в dict.

строку

<li>{{ item }}</li>

вот где я фокусирую внимание. Как и выше, я получаю список ключи в dict.

<li>{{ item["target"] }}</li>

ничего не возвращает. Никто из {{ пользователь.url }} " > {{ user.имя пользователя: }} наберите материал в документах, похоже, работает.

идеи, пожалуйста? Новичок-будь нежен. Спасибо.

обновление

Спасибо за ответы.

ответ Эвана работает,но использует список диктов. Я хочу передать dict и отобразить это (потому что я хочу нецелочисленный индекс элементов). Джинджа так делает?

Также-I МИС-представлены url_list. Это больше похоже на ... --9-->

{'a': {'target': 'http://testing.com/test', 'clicks': '0'}, 
'1': {'target': 'http://10.58.48.103:5000/', 'clicks': '1'}, 
'3': {'target': 'http://slash.org', 'clicks': '4'}, 
'2': {'target': 'http://10.58.48.58:5000/', 'clicks': '1'}}

дальнейшие эксперименты-передача dict приводит к ошибке об объекте списка.

   {% for key in url_list.iteritems() %}

    UndefinedError: 'list object' has no attribute 'iteritems'

еще раз спасибо.

все еще озадачен тем, почему он думал, что я передаю список, но теперь он работает.

{% for key, value in url_list.iteritems() %}
    <li>{{ key }} - {{ value["target"] }} - {{ value["clicks"] }}</li>

выводит все. Большое спасибо.

2 ответов


код url_list должен выглядеть так:

url_list = [{'target': 'http://10.58.48.103:5000/', 'clicks': '1'}, 
            {'target': 'http://slash.org', 'clicks': '4'},
            {'target': 'http://10.58.48.58:5000/', 'clicks': '1'},
            {'target': 'http://de.com/a', 'clicks': '0'}]

затем с помощью:

<li>{{ item["target"] }}</li> 

в вашем шаблоне будет работать.

Edit 1:

ваш шаблон думает, что вы передаете список, так что вы уверены, что вы передаете свой оригинальный дикт, а не мой список выше?

Также вам нужно получить доступ к обоим key и value в вашем словаре (когда вы передаете словарь, а не список):

Python 2.7

{% for key, value in url_list.iteritems() %}
    <li>{{ value["target"] }}</li> 
{% endfor %}

Python 3

{% for key, value in url_list.items() %}
    <li>{{ value["target"] }}</li> 
{% endfor %}

обратите внимание:dict.items() метод существует как в Python 2, так и в Python 3. Но метод не дает никаких гарантий о том, что элементы заказа, содержащиеся в словаре, повторяются. Вот почему для этого примера может иметь смысл использовать список словарей вместо словаря словарей, как вы сказали выше.