Django分层模型列表

时间:2011-11-18 02:57:12

标签: python django model hierarchical-data nested-lists

这应该很简单,但是我只是试着想着如何解决它而粉碎我的头发!

我的网站侧面有一个导航菜单,用于挑选产品。它的格式如下:

  • 每个产品都属于“列表”(点击列表会向您发送包含产品列表的页面)。
  • 每个列表都属于“类别”(单击该类别时使用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 个答案:

答案 0 :(得分:5)

当我看到层次结构或树结构时,我通常会转向mptt,一个修改过的预订遍历树。谷歌“django mptt”,你会发现大量关于使用django-mptt包的教程。

答案 1 :(得分:0)

这样的事情会起作用:

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>

答案 2 :(得分:0)

两个类别组的简单示例。

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

在django中,你必须使用for循环来导航: -

{% 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...]