Django /Python — Собираем данные в правильную форму (алгоритм)

#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