Django / Python - собирать данные в нужной форме (алгоритм) - PullRequest
1 голос
/ 29 апреля 2011

У меня есть такие модели:

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>

Большое спасибо!

Ответы [ 2 ]

1 голос
/ 29 апреля 2011

В вашей функции просмотра вы можете найти 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>
0 голосов
/ 20 декабря 2011

Я использовал это для проблемы: http://djangosnippets.org/search/?q=partition%20list

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...