Django 递归菜单
Django recursive menu
我无法在查看页面上显示第三层
型号
class ShopCategory(models.Model):
enabled = models.BooleanField(default=True)
language = models.CharField(max_length=2)
parent = models.ForeignKey('self', null=True, blank=True, related_name='children')
title = models.CharField(max_length=120)
url = models.SlugField(max_length=200)
查看
def home(request):
categories = ShopCategory.objects.filter(enabled=True, language='en', parent__isnull=True)
return render_to_response('home.html', {'categories': categories}, context_instance=RequestContext(request))
模板
<ul>
{% for category in categories %}
<li>
<a href="/cat/{{ category.url }}/">{{ category.title }}</a>
<ul>
{% for child in category.children.all %}
<li><a href="/cat/{{ category.url }}/{{ child.url }}/">{{ child.title }}</a></li>
{% endfor %}
<ul>
{% for subchild in chil.children.all %}
<li><a href="/cat/{{ chil.url }}/{{ subchild.url }}/">{{ subchild.title }}</a></li>
{% endfor %}
</ul>
</ul>
</li>
{% endfor %}
这是我得到的:
- Beauty
-- Face
-- Make up
我想要的是:
- Beauty
-- Face
-- Make up
--- Lipstick
但是没有显示口红。有什么想法吗?
你有两个错误。首先,您应该遍历 child.children.all
,而不是 chil...
,其次,最后一个循环需要移到第二个循环中。
我认为这是最简单的解决方案:
首先,创建一些 'recursive_menu.html' 模板并放入此代码:
<li>{{ category.title }}
<ul>
{% if category.children %}
{% for child in category.children.all %}
{%with category=child template_name="shop/recursive_menu.html" %}
{%include template_name%}
{%endwith%}
{% endfor %}
{% endif %}
</ul>
</li>
同时您的基本模板如下所示:
<ul>
{% for category in categories %}
{% include "shop/recursive_menu.html" %}
{% endfor %}
</ul>
解释:
- 代码遍历根 'categories' 中的所有类别项目。
- 输出每个类别和关联的布局。
如果该类别有子类别:
- 将类别变量设置为当前类别的子项。
- 递归调用当前模板文件。
- 输出嵌套列表中的任何嵌套子项。
- 根据需要重复递归。
结果如下所示:
我无法在查看页面上显示第三层
型号
class ShopCategory(models.Model):
enabled = models.BooleanField(default=True)
language = models.CharField(max_length=2)
parent = models.ForeignKey('self', null=True, blank=True, related_name='children')
title = models.CharField(max_length=120)
url = models.SlugField(max_length=200)
查看
def home(request):
categories = ShopCategory.objects.filter(enabled=True, language='en', parent__isnull=True)
return render_to_response('home.html', {'categories': categories}, context_instance=RequestContext(request))
模板
<ul>
{% for category in categories %}
<li>
<a href="/cat/{{ category.url }}/">{{ category.title }}</a>
<ul>
{% for child in category.children.all %}
<li><a href="/cat/{{ category.url }}/{{ child.url }}/">{{ child.title }}</a></li>
{% endfor %}
<ul>
{% for subchild in chil.children.all %}
<li><a href="/cat/{{ chil.url }}/{{ subchild.url }}/">{{ subchild.title }}</a></li>
{% endfor %}
</ul>
</ul>
</li>
{% endfor %}
这是我得到的:
- Beauty
-- Face
-- Make up
我想要的是:
- Beauty
-- Face
-- Make up
--- Lipstick
但是没有显示口红。有什么想法吗?
你有两个错误。首先,您应该遍历 child.children.all
,而不是 chil...
,其次,最后一个循环需要移到第二个循环中。
我认为这是最简单的解决方案:
首先,创建一些 'recursive_menu.html' 模板并放入此代码:
<li>{{ category.title }}
<ul>
{% if category.children %}
{% for child in category.children.all %}
{%with category=child template_name="shop/recursive_menu.html" %}
{%include template_name%}
{%endwith%}
{% endfor %}
{% endif %}
</ul>
</li>
同时您的基本模板如下所示:
<ul>
{% for category in categories %}
{% include "shop/recursive_menu.html" %}
{% endfor %}
</ul>
解释:
- 代码遍历根 'categories' 中的所有类别项目。
- 输出每个类别和关联的布局。
如果该类别有子类别:
- 将类别变量设置为当前类别的子项。
- 递归调用当前模板文件。
- 输出嵌套列表中的任何嵌套子项。
- 根据需要重复递归。
结果如下所示: