在层次结构中显示类别和子类别

show category and sub-categories in hierarchy

我正在使用 django-mptt 作为类别模型。我想显示屏幕截图中的类别和子类别列表。我可以显示的方式是没有任何结构的所有列表

卧室用品

衣橱

2 件衣橱

3 件衣橱

双人矮床

大号矮床

这样很难知道哪个是父类,哪个是子类,孙类等。我可以用上面的方式显示,也可以只显示父类Category.objects.root_nodes()

这是我的模型、视图和模板

class Category(MPTTModel):
    name = models.CharField(max_length=100, blank=True, null=True)
    image = models.ImageField(null=True, blank=True,
                              upload_to=upload_furniture_image_path)
    slug = models.SlugField(max_length=200, unique=True)
    parent = TreeForeignKey('self', null=True, blank=True,
                            related_name='children', db_index=True)


def furniture(request, slug):
    instance = get_object_or_404(Furniture, slug = slug)
    cart_obj, new_obj = Cart.objects.new_or_get(request)
    categories = Category.objects.all()
    context = {
        'furniture': instance,
        'cart': cart_obj,
        'categories': categories
    }
    return render(request, 'furnitures/furniture.html', context)




 <div class="panel-body">
      <ul class="nav nav-pills nav-stacked category-menu">
           {% for category in categories %}
              <li>{{category.name}}</li>
           {% endfor %}
       </ul>
  </div>

所以我的问题是如何将父类别和子类别分开以便在屏幕截图中显示?

这是父类及其子类和孙类

由于您使用的是 MPTTModel,因此最好的解决方案是使用 mptt 方法遍历树。

如果您想在模板中显示树结构,您可能需要围绕 mptt 方法编写模板 tags/filters 或使用 mptt 库提供的 tags/filters。

示例解决方案:

views.py

return render_to_response('furnitures/furniture.html',
                           {'nodes':Category.objects.all()}, 
                           context_instance=RequestContext(request))

模板:

<ul class="root">
    {% recursetree nodes %}
        <li>
            {{ node.name }}
            {% if not node.is_leaf_node %}
                <ul class="children">
                    {{ children }}
                </ul>

               {% endif %}
            </li>
        {% endrecursetree %}
    </ul>

解释的很详细here