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>

解释:

  1. 代码遍历根 'categories' 中的所有类别项目。
  2. 输出每个类别和关联的布局。
  3. 如果该类别有子类别:

    • 将类别变量设置为当前类别的子项。
    • 递归调用当前模板文件。
    • 输出嵌套列表中的任何嵌套子项。
    • 根据需要重复递归。

结果如下所示: