Django层次模型列表

2 投票
3 回答
2979 浏览
提问于 2025-04-17 06:33

这件事应该很简单,但我想了半天都不知道该怎么处理,真让人抓狂!

我网站的侧边有一个导航菜单,用来选择产品。它的结构是这样的:

  • 每个产品都属于一个“列表”(点击这个列表会带你到一个显示产品的页面)。
  • 每个列表都属于一个“类别”(点击类别时,会用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

这是一个简单的两个类别分组的例子。

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...]
1

像这样就可以了:

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>
5

当我看到层级或树状结构时,我通常会使用mptt,这是一种修改过的先序遍历树。你可以在网上搜索“django mptt”,会找到很多关于如何使用django-mptt这个工具的教程。

撰写回答