Достъп до стойностите на dict

В момента изграждам малък мениджър (обучаващ питон), използвайки 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)

(Само като използвам тези четири като пример)

В моя шаблон преминавам през тези четири пина и бих искал да покажа моята DB информация (напр. Описание, състояние и id), затова написах този код:

{% 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 и т.н. Тези стойности очевидно нямат свойства като description.

Вместо това използвайте метода 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