написать таблицу с пустыми ячейками на основе словаря значений - PullRequest
1 голос
/ 19 марта 2009

У меня есть это представление в моем приложении:

def context_detail(request, context_id):
c = get_object_or_404(Context, pk=context_id)
scs = SherdCount.objects.filter(assemblage__context=c).exclude(count__isnull=True)
total = sum(sc.count for sc in scs)
table = []
forms = []
for a in c.assemblage_set.all():
    for sc in a.sherdcount_set.all():
        forms.append(sc.typename)
forms_set = set(forms)
for a in c.assemblage_set.all():
    diko = {}
    diko['assemblage'] = a
    for f in forms_set:
        for sc in a.sherdcount_set.all():
            if f == sc.typename:
                diko[f] = sc.count
            else:
                diko[f] = 0
    table.append(diko)
return render_to_response('tesi/context_detail.html',
    {'context': c, 'total': total, 'sherdcounts': scs, 'table': table, 'forms': forms_set},
    context_instance=RequestContext(request))

Целью этих двух циклов for было бы создание списка словарей, который содержит значения SherdCount.count со ссылкой на внешний ключ SherdCount.typename (и я смог это сделать, даже если текущий код немного запутался).

Список "таблица" должен содержать что-то вроде этого:

[{<Type: Hayes 61B>: 0, <Type: Hayes 99A-B>: 0, <Type: Hayes 105>: 0, <Type: Hayes 104A>: 0, <Type: Hayes 104B>: 0, <Type: Hayes 103>: 0, <Type: Hayes 91>: 0, <Type: Hayes 91A>: 0, <Type: Hayes 91B>: 0, <Type: Hayes 91C>: 0, <Type: Hayes 91D>: 0, <Type: Hayes 85B>: 0, <Type: Hayes 82A>: 0, <Type: Hayes 76>: 0, <Type: Hayes 73>: 0, <Type: Hayes 72>: 0, <Type: Hayes 70>: 0, <Type: Hayes 68>: 0, <Type: Hayes 67>: 0, <Type: Hayes 66>: 0, <Type: Hayes 62A>: 0, <Type: Hayes 80B>: 0, <Type: Hayes 59>: 0, <Type: Hayes 61A>: 0, <Type: Hayes 91A-B>: 0, <Type: Hayes 58>: 0, <Type: Hayes 50>: 0, <Type: Hayes 53>: 0, <Type: Hayes 71>: 0, <Type: Hayes 60>: 0, <Type: Hayes 80A>: 0, <Type: Hayes Style A2-3>: 0, <Type: Hayes Style B>: 0, <Type: Hayes Style E1>: 1, 'assemblage': <Assemblage: Brescia, Santa Giulia : non periodizzato>}, {<Type: Hayes 61B>: 0, <Type: Hayes 99A-B>: 0, <Type: Hayes 105>: 0, <Type: Hayes 104A>: 0, <Type: Hayes 104B>: 0, <Type: Hayes 103>: 0, <Type: Hayes 91>: 0, <Type: Hayes 91A>: 0, <Type: Hayes 91B>: 0, <Type: Hayes 91C>: 0, <Type: Hayes 91D>: 0, <Type: Hayes 85B>: 0, <Type: Hayes 82A>: 0, <Type: Hayes 76>: 0, <Type: Hayes 73>: 0, <Type: Hayes 72>: 0, <Type: Hayes 70>: 0, <Type: Hayes 68>: 0, <Type: Hayes 67>: 0, <Type: Hayes 66>: 0, <Type: Hayes 62A>: 0, <Type: Hayes 80B>: 0, <Type: Hayes 59>: 0, <Type: Hayes 61A>: 0, <Type: Hayes 91A-B>: 0, <Type: Hayes 58>: 0, <Type: Hayes 50>: 0, <Type: Hayes 53>: 0, <Type: Hayes 71>: 0, <Type: Hayes 60>: 0, <Type: Hayes 80A>: 0, <Type: Hayes Style A2-3>: 0, <Type: Hayes Style B>: 3, <Type: Hayes Style E1>: 0, 'assemblage': <Assemblage: Brescia, Santa Giulia : Periodo IIIA>},

Но многие значения 0 явно неверны. хотя там могут быть нули (пустые ячейки, о которых я говорил)

Вопрос в том, как после создания такого списка, как мне создать таблицу в шаблоне со всеми ячейками (например, 1 строка на тип и 1 столбец на контекст, с SherdCount в ячейках)?

Steko

1 Ответ

2 голосов
/ 19 марта 2009

Вот структура данных.

[{<Type1>: 16,
  <Type2>: 10,
  <Type3>: 12,
  <Type4>: 7,
  <Type5>: 0,
  'assemblage': <Assemblage1>},
 {<Type1>: 85,
  <Type2>: 18,
  <Type3>: 21,
  <Type4>: 12,
  <Type5>: 2,
  'assemblage': <Assemblage2>},
 ...]

Проблема в том, что результирующая таблица должна генерироваться в порядке строк, а этот список словарей - в порядке столбцов. Таким образом, список диктов должен быть повернут в мажорном порядке.

from collections import defaultdict
titles = []
cells = defaultdict(list)
for x,col in enumerate(table):
    titles.append( col['assemblage'] )
    for rk in col:
        if rk == 'assemblage': continue # skip the title
        cells[rk][x]= col[rk]

Также это помогает формализовать результаты в виде списка списков; словари не имеют внутреннего порядка.

final= []
for name in sorted( cells.keys() ):
    final.append( cells[name] )

Вот шаблон для отображения titles и final в виде таблицы.

<table>
  <tr>
    {% for t in titles %}<th>{{t}}</th>{% endfor %}
  </tr>
  {% for row in final %}
  <tr>
      {% for cell in row %}<td>{{cell}}</td>{% endfor %}
  </tr>
  {% endfor %}
</table>
...