2016-12-06 3 views
0

Краткое описание: Я создаю веб-сайт, на котором отображаются события, которые я удалил с других сайтов.Структуры данных для jinja

Задача: На данный момент я могу отображать события по дням, но вам нужно перечислить все вручную. Нет для циклов.

Это потому, что у меня есть словарь списков, которые я считаю. Чтобы получить титул, одного из событий происходят сегодня синтаксис:

{{D.rows0[1].title}} 

где D представляет собой словарь rows0 является динамическим переменной, которая представляет день, rows1, rows2 также существует. rowsX содержит title, date, x, y, z и др. Информация о событиях.

что бы вернуть что-то вроде «разговоров о й»

Причины я не могу перебирать структуры данных из динамических переменных (я пытался сделать в Jinja). Я относительно новичок в структурах данных и не понял, что динамические структуры данных вызовут такие проблемы.

Я столкнулся с различными различными циклами и сдался. Затем я решил изменить свою структуру данных на словарь массивов, возникла проблема с передачей словаря массивов на html-страницу.

Заключение. Мой вопрос в том, должен ли я найти способ итерации через динамическую переменную с Jinja? Найти способ передать массив в файл .html, или я все делаю неправильно?

ДАЛЕЕ ОБЪЯСНЕНИЕ

функции извлечь информацию из базы данных

d = {} 
D = {} 

def extractor1(n): 
    d["date" + str(n)] = (datetime.datetime.now() + datetime.timedelta(days=0)).date() 
    D["rows" + str(n)] = db.execute ("SELECT * FROM events WHERE date LIKE :date ORDER BY date", date = str(d["date" + str(n)]) +'%') 
    return d, D 

Это структура данных я не могу перебрать с для петель в Джиндже ..

Вторая функция попытка массивов:

для этой функции я никогда не пытался пробовать ее через Jinja из-за ошибок, которые я получал. D и d были все еще словарями, я был немного креативен тем, какими были дата и строение структуры данных, я попробовал массив и словарь. Но, пытаясь исправить и придумать новые проблемы, я решил, что это может быть не самый лучший способ.

def extractor2(n): 
    d[date[n]] = (datetime.datetime.now() + datetime.timedelta(days=0)).date() 
    D[rows[n]] = db.execute ("SELECT * FROM events WHERE date LIKE :date ORDER BY date", date = str(str(d[date[n]])) +'%') 
    return d, D 

Код Jinja был всего лишь мириадом различных для петель, из которых никто не работал.

+0

Сообщение о том, как шаблон вызывается (код Python), поможет нам понять, правильно ли вы делаете или совершенно неправильно. Также что вы подразумеваете под динамической переменной? – metatoaster

+0

Так почему бы не использовать переменную 'rows', которая является списком, а не использовать' rows0', 'rows1' и т. Д.? Не производите загрузку нумерованных имен переменных, если вы можете использовать один контейнер; 'for row in D.rows:' тривиально, попытка делать имена динамических переменных в Jinja - это кошмар (и он также находится на Python). –

+1

И если 'D' - это словарь, вы можете перебрать' D' в Jinja, чтобы получить ключи, и вы можете использовать 'D [keyname]' для получения значения. Вы, вероятно, захотите перебрать отсортированные ключи, но это будет использовать * лексикографический * порядок (поэтому 'row10' предшествует' row2'). Вы можете также перебирать 'D.values ​​()', но словари не сохраняют порядок и не должны использоваться, если порядок важен. –

ответ

1

Вы рисуете себя в углу, динамически создавая пронумерованные клавиши. У вас есть последовательность, а не ряд отдельных частей данных; извлечение этих ключей позже позже будет только болезненным.

Вместо нумерованных словарных клавиш используйте список .Вы можете объединить данные о дате и запросов вместе в один кортеж для каждой записи:

results = [] 
for n in range(number_of_entries): 
    date = (datetime.datetime.now() + datetime.timedelta(days=0)).date() 
    rows = db.execute ("SELECT * FROM events WHERE date LIKE :date ORDER BY date", date = str(date) + '%') 
    results.append((date, rows)) 

затем перебирает полученный список в шаблоне Джиндего:

{% for date, rows in results %} 
    <tbody><tr><th colspan="3" class="event-date-header">{{ date }}</th></tr> 
    {% for row in rows %} 
     <tr> 
      <td class="event-foo"><a href="{{ row[0] }}">{{ row[1].title }}</a></td> 
      <td class="event-bar"><{{ row[2] }}</td> 
      <td class="event-baz"><{{ row[3] }}</td> 
    {% endfor %} 
    <tbody>  
{% endfor %} 

Вместо кортежа, словарь для каждой записи будет также хорошо, но тогда вы не можете так легко использовать назначение кортежа, как показано во внешнем цикле Jinja выше.

+0

не добавляет только один аргумент? – Tank

+0

@ Tanc27: да, извините, скобки в скобках там отсутствовали. –

Смежные вопросы