2014-11-20 5 views
0

скажем, у меня есть следующие данные: (по аннотирование QuerySet)Как разобрать записи в HTML-таблицы в шаблонах Django

games = ['A','B','C'] 
names = ['John','Tom'] 
records = [ 
{'name':'John', 'game':'B', 'score':200}, 
{'name':'John', 'game':'C', 'score':100}, 
{'name':'Tom', 'game':'A', 'score':300}, 
{'name':'Tom', 'game':'C', 'score':100}] 

Я хочу, чтобы отобразить на HTML-таблицу в качестве кросс-таблицы:

 A B C 
John  200 100 
Tom 300  100 

до сих пор я могу только достигнуть этого путем изменения структуры данных, как это:

[{'name':'John', 'games':['', 200, 100]}, 
{'name':'Tom', 'games':[300,'',100]}] 

есть ли какие-то более эффективные способы, чтобы я мог использовать тыс e исходные данные без особого изменения.

ответ

0

Вообще в Django философия является, чтобы изменить свои данные в представлении первых, сохраняя шаблоны как можно более простым (а не усложнив изменения формы кода в шаблонах)

Это говорит, в вашем случае вы можете получить долгий путь с этим:
https://docs.djangoproject.com/en/dev/ref/templates/builtins/#regroup

проход ['A', 'B', 'C'] в контексте вашего шаблона, как columns

{% regroup records by name as grouped_records %} 
<table> 
    <thead> 
    <tr> 
     <th></th> 
     {% for column in columns %} 
     <th>{{ column }}</th> 
     {% endfor %} 
    </tr> 
    </thead> 
    <tbody> 
    {% for group in grouped_records %} 
    <tr> 
     <td>{{ group.grouper }}</td> 
     {% for column in columns %} 
     <td> 
     {% for record in group.list %} 
      {% if record.game == column %}{{ record.score }}{% endif %} 
     {% endfor %} 
     </td> 
     {% endfor %} 
    </tr> 
    {% endfor %} 
    </tbody> 
</table> 
0

мое окончательное решение является restruct данных

первого заполнения всех ячеек со значением по умолчанию:

records = [] 
for name in names: 
    record = {} 
    record['name'] = name 
    # add other key if need 
    record['data'] = [''] * len(games) 
    records.append(record.copy()) 

for data in datalist: 
    name = names.index(data['name']) 
    game = games.index(data['game']) 
    records[name][game] = data['score'] 

затем перейти к шаблону:

... 
{% for record in records %} 
<tr> 
    <td>{{ record.name }}</td> 
    {% for data in record.date %} 
    <td>{{ data }}</td> 
    {% endfor %} 
</tr> 
{% endfor %} 
... 

Мой restruct код достаточно долго, перед использованием " индекс".

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