Рендеринг 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. Но метод не дает никаких гарантий о том, что элементы заказа, содержащиеся в словаре, повторяются. Вот почему для этого примера может иметь смысл использовать список словарей вместо словаря словарей, как вы сказали выше.