【问题标题】:child node is treated as grand child node when trying to structure尝试构建时,子节点被视为大子节点
【发布时间】:2017-12-05 01:49:02
【问题描述】:

我使用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 %}

这产生了以下类别的设计

这里的 Dressing Table 是 Bed 和 Almirah 等卧室物品的子项,而不是 Bed 的子项。我该如何解决这个问题?我知道问题出在这里

<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 %}">

但无法解决此问题

不是截图中的梳妆台

【问题讨论】:

  • 你的意思是Dressing Tableroot 节点吗?
  • 不,dressing table 是卧室物品的孩子(引用)
  • 那么渲染就已经正确了。 dressing table 是卧室节点的子节点。您期望的结构是什么?
  • 不是我,但我猜它应该呈现为BedAlmirah,我再次引用图片下方的行。
  • 好的。我得到了现在的情况。他需要确定叶子节点。但是该叶节点是根节点的第二级。所以他需要Dressing Table 成为cyan 颜色。

标签: python django django-templates django-views django-mptt


【解决方案1】:

根据您更新的答案。
Dinning Set, Kitchen Rack, and Kitchen Setup(Modular Kitchen) 应该是cyan,因为它们是二级。 如果我的理解是正确的。
这是我的黑客解决方案。如果有人找到更好的,请提出。

  1. Model 实例添加额外的方法
  2. 我必须将nodes 添加到context。 (如果您像我一样使用 Django2.0,这将是可选的)
  3. 在模板中使用实例方法

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

views.py

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>

【讨论】:

  • 这就是我为之奋斗的目标。感谢您的努力和知识。
猜你喜欢
  • 1970-01-01
  • 2017-07-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-17
  • 1970-01-01
  • 1970-01-01
  • 2022-09-23
相关资源
最近更新 更多