Django список иерархических моделей - PullRequest
2 голосов
/ 18 ноября 2011

Это должно быть просто, но я ломаю свои волосы, просто пытаясь придумать, как с этим справиться!

У меня есть меню навигации внизу моего сайта, которое используется для выбора товаров. Он отформатирован так:

  • Каждый товар относится к «списку» (щелчок по списку отправляет вам страницу со списком товаров).
  • Каждый список относится к «категории» (при нажатии на категорию используется jquery для расширения списка под ним при нажатии, но это не имеет значения)
  • Каждая категория принадлежит к «Группе категорий», которая разделяет категории на отдельные группы в зависимости от того, с какой областью бизнеса вы имеете дело)

Проще говоря, продукты принадлежат списку, который принадлежит категории, которая принадлежит группе категорий. Все они отношения один-ко-многим.

Мне нужно передать это из моего представления в мой шаблон таким образом, чтобы я мог отобразить вложенный список в HTML, чтобы сделать jquery красивым. Что-то вроде:

<ul>
    <li>Category Group</li>
    <ul>
        <li>Category</li>
        <ul>
            <li>List</li>
            <li>List</li>
            <li>List</li>
        </ul>
        <li>Category</li>
        <ul>
            <li>List</li>
            <li>List</li>
            <li>List</li>
        </ul>
    </ul>
    <li>Category Group</li>
    <ul>
        <li>Category</li>
        <ul>
            <li>List</li>
            <li>List</li>
            <li>List</li>
        </ul>
        <li>Category</li>
        <ul>
            <li>List</li>
            <li>List</li>
            <li>List</li>
        </ul>
    </ul>
</ul>

Моя проблема заключается в создании указанного иерархического списка для передачи в шаблон, чтобы он мог его визуализировать. Я знаю, что мне нужно использовать Model.FK_set.all (), чтобы получить, скажем, список «категорий» в «группе категорий», но я не могу понять, как создать этот список в представлении в соответствующий способ отправки по шаблону. Любая помощь? Новичок в Python, так что все еще изучаю веревки.

Ответы [ 3 ]

5 голосов
/ 18 ноября 2011

Когда я вижу иерархические или древовидные структуры, я обычно обращаюсь к mptt, модифицированному дереву обхода предварительного заказа.Google "django mptt", и вы найдете большое количество учебных пособий по использованию пакета django-mptt .

0 голосов
/ 18 ноября 2011

Простой пример группы из двух категорий.

a = [1,2]
b = [3,4,5]
c = [6,7]
d = [8]
item1 = [a,b]
item2 = [c,d]
mygroup = [item1,item2]

В django вам придется использовать циклы для навигации: -

{% for items in mygroup %}
    // Group Category title here
    (% for list in items %}
        // Group title here
            (% for contents in list %}
                  // all the unit contents
[...dont forget to close your for loops...]
0 голосов
/ 18 ноября 2011

Примерно так будет работать:

from __future__ import with_statement
import os
from django.template import Context, Template

os.environ['DJANGO_SETTINGS_MODULE'] = 'settings'

menu = {
    'food':
        {'fruit':
            ['apple', 'orange'],
        'meat':
            ['beef', 'pork'],
        },
    'animals':
        {'mamals':
             ['cow', 'bear'],
         'reptiles':
             ['frog', 'newt'],
        },
}


with open('template.html', 'r') as infile:
    html = infile.read()
    t = Template(html)

    print t.render(Context({'menu': menu}))

Шаблон:

<html>
<body>
<ul>
{% for name, cat_group in menu.items %}
<li>{{ name }}</li>
    <ul>
    {% for name, cat in cat_group.items %}
    <li>{{ name }}</li>
        <ul>
        {% for product in cat %}
        <li>{{ product }}</li>
        {% endfor %}
        </ul>
    {% endfor %}
    </ul>
{% endfor %}
</ul>
</body>
</html>
...