#python #django #algorithm #sorting #django-templates
#python #django #алгоритм #сортировка #django-шаблоны
Вопрос:
У меня есть модели, подобные этой:
Item:
name
desc
AttrGroup:
name
order
AttrName:
name
group.ForeinKey(AttrGroup)
order
AttrVal:
value
attr.ForeinKey(AttrName)
item.ForeinKey(Item)
Итак, я хочу сравнить атрибуты n элементов в списке items_id=[1,3,7, …]
В представлениях я делаю что-то вроде этого:
attrs = AttrVal.object.filter(item__id__in=items_id)
и отправляем в шаблоны. Но я собираюсь запутаться в том, как упорядочить список для интерфейса.
Шаблонам должно понравиться это:
<table>
{% for g in group %}
<tr class="group_name">{{ g.name }}</tr>
{% for a in attrs %}
<tr>
<td>{{ a.name }}</td>
{% for i in items_id %}
<td>{{ value of item 'i' }}</td>
{ %endfor %}
</tr>
{% endfor %}
{% endfor %}
</table>
Я думаю, что у этого будет хорошее решение для этой проблемы. Спасибо!
Обновление: Следуя хорошему решению от @Lott, я нашел способ, как отображать данные в шаблонах. Я использую код, который нравится этому:
{% for g in groups %}
<tr class="title_row">
<td class="group_name" colspan="{{ no_items }}">{{ g.0 }}</td>
</tr>
{% for a in g.1 %}
<tr>
<td>{{ a.attr.name }}</td>
{% for i in comparing_items %}
<td>{% if a.item.id == i %}{{ a.value }}{% endif %}</td>
{% endfor %}
</tr>
{% endfor %}
{% endfor %}
И появляется:
<table>
<tr>
<td>Attr Name 1</td>
<td>Attr Value of Item 1</td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>Attr Name 2</td>
<td>Attr Value of Item 1</td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>Attr Name 1</td>
<td></td>
<td></td>
<td></td>
<td>Attr Value of Item 4</td>
</tr>
</table>
Моя цель состоит в том, чтобы перечислить один и тот же атрибут элементов [1,2,3, …] в одной строке. HTML должен быть таким:
<table>
<tr>
<td>Attr Name 1</td>
<td>Attr Value of Item 1</td>
<td>Attr Value of Item 2</td>
<td>Attr Value of Item 3</td>
<td>Attr Value of Item n</td>
</tr>
<tr>
<td>Attr Name 2</td>
<td>Attr Value of Item 1</td>
<td>Attr Value of Item 2</td>
<td>Attr Value of Item 3</td>
<td>Attr Value of Item n</td>
</tr>
<tr>
<td>Attr Name m</td>
<td>Attr Value of Item 1</td>
<td>Attr Value of Item 2</td>
<td>Attr Value of Item 3</td>
<td>Attr Value of Item n</td>
</tr>
</table>
Большое вам спасибо!
Ответ №1:
В вашей функции просмотра вы можете найти attrName и AttrGroup для каждого attrValue в attrs
наборе запросов. Вы создаете соответствующие группы в функции просмотра. Затем вы отображаете детали в своем шаблоне.
groups = defaultdict( list )
for a in attrs:
groups[a.attr.group.order, a.attr.group.name].append( a )
group_list = [ (name[1], groups[name]) for name in sorted( groups.keys() ) ]
Ваш шаблон будет выглядеть следующим образом
<table>
{% for g in group_list %}
<tr class="group_name">{{ g.0 }}</tr>
{% for a in g.1 %}
<tr>
<td>{{ a.name }}</td>
{% for i in a.item %} <!-- Yes, you can refer to methods of model objects. -->
<td>{{ i }}</td>
{ %endfor %}
</tr>
{% endfor %}
{% endfor %}
</table>
Комментарии:
1. Привет, Лотт, спасибо за решение. И результат вашего способа хорош, но в нем есть некоторые недостатки img855.imageshack.us/img855/4701/screenshot20110429at857.png
2. @Anh Tran: «какая-то проблема»? Пожалуйста, будьте более точны в описании проблемы. Возможно, вы захотите обновить вопрос с помощью кода, который вы фактически использовали, и «некоторой проблемы», с которой вы столкнулись.
3. Извините, я виноват. На самом деле, я хочу собрать отмеченные атрибуты (посмотреть на картинке) в одной строке. Вот и все. Спасибо 🙂 img839.imageshack.us/img839/4701/screenshot20110429at857.png
4. @Anh Tran: «Я хочу собрать отмеченные атрибуты»? Пожалуйста, будьте более точны в описании проблемы. Пожалуйста, обновите вопрос, чтобы он был полным, точным и конкретизированным. Картинка на самом деле не помогает. Пожалуйста, предоставьте как можно более полную спецификацию. Также, пожалуйста, измените предоставленный код, чтобы он заработал. Вы не обязаны использовать код, который я написал. И я не буду тратить много времени на отладку деталей вашего приложения.
5. @Lott: Ваш код работает хорошо. Но проблема в шаблонах. Пожалуйста, получите представление с помощью рисунка. Большое спасибо! img819.imageshack.us/img819/4701/screenshot20110429at857.png
Ответ №2:
Я использовал это для решения проблемы:http://djangosnippets.org/search /?q=раздел list