Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/324.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/21.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 Templates_Django Views_Django Mptt - Fatal编程技术网

Python 在尝试构造时,子节点被视为大子节点

Python 在尝试构造时,子节点被视为大子节点,python,django,django-templates,django-views,django-mptt,Python,Django,Django Templates,Django Views,Django Mptt,我正在使用django-mptt库进行分类。我可以在模板中显示类别列表,但我想将其适当缩进,以便用户可以知道哪个类别是主类别,哪个类别是子类别等等。我尝试的结构方式是 {% recursetree nodes %} <li class="node"> <a href="/category/{{ node.get_absolute_url }}" class="{% if not node.is_leaf_node and not node.is_root

我正在使用
django-mptt
库进行分类。我可以在模板中显示类别列表,但我想将其适当缩进,以便用户可以知道哪个类别是主类别,哪个类别是子类别等等。我尝试的结构方式是

{% recursetree nodes %}
  <li class="node">
    <a href="/category/{{ node.get_absolute_url }}"
      class="{% if not node.is_leaf_node and not node.is_root_node and node.is_child_node %} child_parent {% elif node.is_leaf_node and not node.is_root_node %}leaf_node{% endif %}">
      {{ node.name }}
      {% if node.is_root_node %}
        <span class="badge">{{ node.get_count_children }}</span>
      {% endif %}
    </a>
      {% if not node.is_leaf_node %}
          <ul class="children">
            <li>{{ children }}</li>
          </ul>
      {% endif %}
  </li>
{% endrecursetree %}
{%recursetree节点%}
  • {%如果不是node.is_leaf_node%}
    • {{儿童}
    {%endif%}
  • {%endrecursetree%}
    这将产生以下类别的设计

    在这里,梳妆台是床和衣橱等卧室物品的孩子,而不是床的孩子。我怎样才能解决这个问题?我知道问题在这里

    <a href="/category/{{ node.get_absolute_url }}"
    class="{% if not node.is_leaf_node and not node.is_root_node and node.is_child_node %} child_parent {% elif node.is_leaf_node and not node.is_root_node %}leaf_node{% endif %}">
    

    根据您更新的答案
    餐具、厨房架和厨房设置(模块化厨房)
    应该是青色的,因为它们是二级的。 如果我的理解正确。
    这是我的破解方案。如果有人找到更好的,请举手

  • 模型
    实例添加额外的方法
  • 我必须将
    节点
    添加到
    上下文
    。(如果您使用的是像我一样的Django2.0,这将是可选的)
  • 在模板中使用实例方法
  • models.py

    from django.db import models
    from mptt.models import MPTTModel, TreeForeignKey
    
    
    class Genre(MPTTModel):
        name = models.CharField(max_length=50, unique=True)
        parent = TreeForeignKey('self', null=True, blank=True, related_name='children', db_index=True,
                                on_delete=models.CASCADE)
    
        class MPTTMeta:
            order_insertion_by = ['name']
    
        def __str__(self):
            return f'{self.name}'
    
        def is_second_node(self):
            return True if (self.get_ancestors().count() == 1) else False
    
    from django.views.generic import ListView
    
    from genres.models import Genre
    
    
    class GenreListView(ListView):
        model = Genre
        template_name = 'genre_list.html'
    
        def get_context_data(self, *, object_list=None, **kwargs):
            """Get the context for this view."""
            queryset = object_list if object_list is not None else self.object_list
            page_size = self.get_paginate_by(queryset)
            context_object_name = self.get_context_object_name(queryset)
            if page_size:
                paginator, page, queryset, is_paginated = self.paginate_queryset(queryset, page_size)
                context = {
                    'paginator': paginator,
                    'page_obj': page,
                    'is_paginated': is_paginated,
                    'object_list': queryset
                }
            else:
                context = {
                    'paginator': None,
                    'page_obj': None,
                    'is_paginated': False,
                    'object_list': queryset
                }
            if context_object_name is not None:
                context[context_object_name] = queryset
            context.update(kwargs)
            context['nodes'] = context.get('object_list')
            return super().get_context_data(**context)
    
    views.py

    from django.db import models
    from mptt.models import MPTTModel, TreeForeignKey
    
    
    class Genre(MPTTModel):
        name = models.CharField(max_length=50, unique=True)
        parent = TreeForeignKey('self', null=True, blank=True, related_name='children', db_index=True,
                                on_delete=models.CASCADE)
    
        class MPTTMeta:
            order_insertion_by = ['name']
    
        def __str__(self):
            return f'{self.name}'
    
        def is_second_node(self):
            return True if (self.get_ancestors().count() == 1) else False
    
    from django.views.generic import ListView
    
    from genres.models import Genre
    
    
    class GenreListView(ListView):
        model = Genre
        template_name = 'genre_list.html'
    
        def get_context_data(self, *, object_list=None, **kwargs):
            """Get the context for this view."""
            queryset = object_list if object_list is not None else self.object_list
            page_size = self.get_paginate_by(queryset)
            context_object_name = self.get_context_object_name(queryset)
            if page_size:
                paginator, page, queryset, is_paginated = self.paginate_queryset(queryset, page_size)
                context = {
                    'paginator': paginator,
                    'page_obj': page,
                    'is_paginated': is_paginated,
                    'object_list': queryset
                }
            else:
                context = {
                    'paginator': None,
                    'page_obj': None,
                    'is_paginated': False,
                    'object_list': queryset
                }
            if context_object_name is not None:
                context[context_object_name] = queryset
            context.update(kwargs)
            context['nodes'] = context.get('object_list')
            return super().get_context_data(**context)
    
    genre_list.html

    <!DOCTYPE html>
    {% load mptt_tags %}
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Genre ListView</title>
    </head>
    <style>
        .root {color: purple}
        .child{color: cyan}
        .leaf {color: gray}
    </style>
    <body>
        {% recursetree nodes %}
        <div class="
            {% if node.is_root_node %}
            root
            {% elif node.is_child_node and not node.is_leaf_node or node.is_second_node%}
            child
            {% elif node.is_leaf_node and not node.is_root_node%}
            leaf
            {%endif%}">
            {{node.name}}
            {{node.is_second_node}}
        </div>
        {% if not node.is_leaf_node%}
        <ul>{{children}}</ul>
        {% endif %}
    
        {% endrecursetree %}
    </ul>
    </body>
    </html>
    
    
    {%load mptt_标记%}
    类型列表视图
    .root{color:purple}
    .child{color:cyan}
    .leaf{颜色:灰色}
    {%recursetree节点%}
    {{node.name}
    {{node.is_second_node}
    {如果不是节点,则为%is\u leaf\u node%}
    
      {{children}
    {%endif%} {%endrecursetree%}

    你的意思是
    梳妆台
    是一个
    根节点
    吗?不,
    梳妆台
    是卧室物品的子节点(引用),然后渲染就已经正确了<代码>梳妆台
    是卧室节点的子节点。你期望的结构是什么?不是我,但我猜它应该呈现为床和衣橱,我再次引用了图片下面的一行。好的。我现在知道情况了。他需要确定叶节点。但叶节点是根节点的第二级。所以他需要
    梳妆台
    变成
    青色
    的颜色。这就是我一直在争取的。谢谢你的努力和知识。