Django层次模型列表
这件事应该很简单,但我想了半天都不知道该怎么处理,真让人抓狂!
我网站的侧边有一个导航菜单,用来选择产品。它的结构是这样的:
- 每个产品都属于一个“列表”(点击这个列表会带你到一个显示产品的页面)。
- 每个列表都属于一个“类别”(点击类别时,会用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这个工具的教程。