Доступ к значениям dict

В настоящее время я создаю небольшой менеджер (изучаю Python) с помощью Pythons Flask, который использует механизм шаблонов Jinja2. Я использую Peewee для общения с моей базой данных.

У меня есть словарь контактов, который содержит информацию о данном контакте. Информация о булавках поступает непосредственно от Peewee, например:

pins = {}
pins[3] = Pin.get(Pin.id == 3)
pins[5] = Pin.get(Pin.id == 5)
pins[7] = Pin.get(Pin.id == 7)
pins[8] = Pin.get(Pin.id == 8)

(Используя только эти четыре в качестве примера)

В моем шаблоне я повторяю эти четыре контакта и хотел бы отобразить информацию о своей БД (например, описание, состояние и идентификатор), поэтому я написал этот код:

{% for pin in pins %}
 {% if pin.state %}
  <input type="checkbox" checked="checked" data-toggle="toggle" data-pin="{{ pin.id }}">
 {% else %}
  <input type="checkbox" data-toggle="toggle" data-pin="{{ pin.id }}" ?>
 {% endif %}
 {{ pin.description }}
 <br>
{% endfor %}

Согласно веб-сайту jinja2 и этот вопрос код должен работать, так как я обращаюсь к pin.state, pin.id и pin.description внутри цикла.

Но это не так. Независимо от того, какое свойство я пытаюсь показать, оно просто ничего не дает мне при использовании {{ pin.description }} для доступа к свойству. Я заметил следующее, что может помочь

  1. Если я сделаю {{ pin }} внутри цикла, он напечатает текущий ключ словаря.
  2. Если я сделаю {{ pins[pin].description }} внутри цикла, он напечатает правильное описание.

Согласно моему пониманию документации и связанного вопроса, должна быть возможность показать текущие значения, используя {{ pin.description }} внутри цикла.

Может ли кто-нибудь пролить свет на мою ошибку?


person Fizk    schedule 11.01.2015    source источник


Ответы (1)


Проблема в том, что вы сделали словарь, а не список. Когда вы перебираете словарь с помощью for pin in pins, вы перебираете ключи, а не значения, поэтому на каждой итерации вы получаете одно из 3, 5, 7 и т. д. Эти значения, очевидно, не имеют свойств. как 2_.

Вместо этого используйте метод values():

{% for pin in pins.values() %}

Или вы можете рассмотреть возможность использования списка в первую очередь.

person Daniel Roseman    schedule 11.01.2015
comment
Вы также можете сделать pins = Pin.select().where(Pin.id << [3, 5, 7, 8]), чтобы получить список пинов с заданными идентификаторами. - person coleifer; 11.01.2015