Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在层次结构中显示类别和子类别_Python_Django_Django Models_Django Views_Django Mptt - Fatal编程技术网

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

Python 在层次结构中显示类别和子类别,python,django,django-models,django-views,django-mptt,Python,Django,Django Models,Django Views,Django Mptt,我使用django mptt作为类别模型。我想显示屏幕截图中的类别和子类别列表。我可以展示的方式是所有列表,没有任何结构,如下所示 卧室用品 衣橱 两件式衣橱 3件式衣橱 床 双层矮床 大号矮床 这样很难知道哪一个是父类别,哪一个是子类别和孙子类别等。我可以使用category.objects.root\u nodes() 这是我的模型、视图和模板 class Category(MPTTModel): name = models.CharField(max_length=100, bl

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

卧室用品

衣橱

两件式衣橱

3件式衣橱

双层矮床

大号矮床

这样很难知道哪一个是父类别,哪一个是子类别和孙子类别等。我可以使用
category.objects.root\u 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):
name=models.CharField(max_length=100,blank=True,null=True)
image=models.ImageField(null=True,blank=True,
上传到=上传家具图片路径)
slug=models.SlugField(最大长度=200,唯一性=True)
parent=treeforeingkey('self',null=True,blank=True,
相关_name='children',db_index=True)
def家具(请求,slug):
实例=获取对象或404(家具,slug=slug)
cart\u obj,new\u obj=cart.objects.new\u或\u get(请求)
categories=Category.objects.all()
上下文={
"家具":比如,,
“购物车”:购物车,
“类别”:类别
}
返回渲染(请求'furnitures/furniture.html',上下文)
    {categories%%中的类别为%s}
  • {{category.name}
  • {%endfor%}
所以我的问题是,我怎样才能把父类和子类分开,这样我才能像截图一样显示出来

下面是父类别及其子类别和孙子类别


因为您使用的是MPTTModel,所以最好的解决方案是使用mptt方法遍历树

如果要在模板中显示树结构,可能需要围绕mptt方法编写模板标记/过滤器,或者使用mptt库提供的标记/过滤器

示例解决方案:

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>
    {%recursetree节点%}
  • {{node.name} {%如果不是node.is_leaf_node%}
      {{儿童}
    {%endif%}
  • {%endrecursetree%}

详细解释

您是否有一个名为“男士”的家长类别?如果没有将“男士”、“女士”、“孩子”放在哪里,我有一个卧室物品的家长类别,其子类别为alimrah(其子类别为2件式衣橱、3件式衣橱)、床(大号床、特大号床作为子类别),您可以在中查看演示。要查看侧边栏,您必须单击家具标题以获取解决方案。然而,我得到了一个错误,它以10为底表示int()的无效文本:“tree_id”我知道它为什么会引发这个错误。它要求我提供id,但我需要获取所有父类别及其子类别,而不仅仅是一个父类别。它是一个根还是多个根?然后使用category.objects.root\u nodes(),我相应地修改了解决方案。让我知道解决方案是否有用。这是我之前尝试过的,但我只得到父节点,而不是子节点,尽管它们有自己的子节点