Django递归菜单

时间:2015-01-24 17:44:02

标签: django recursion

我无法在视图页面上显示第三级

模型

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

但它没有显示唇膏。有什么想法吗?

2 个答案:

答案 0 :(得分:1)

在我看来,这是最简单的解决方案:

首先,创建一些&requoive_menu.html&#39;模板并输入此代码:

<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. 代码遍历根&#39;类别&#39;。
  2. 中的所有类别项
  3. 输出每个类别和相关的布局。
  4. 如果该类别有子女:

    • 将类别变量设置为当前类别的子项。
    • 递归调用当前模板文件。
    • 在嵌套列表中输出任何嵌套的子项。
    • 根据需要重复递归。
  5. 结果如下所示:

    enter image description here

答案 1 :(得分:0)

您有两个错误。首先,您应该遍历child.children.all,而不是chil...,其次,最后一个循环需要在第二个循环内移动。