Python Django如何从自参考模型建立ul-li层次结构

Python Django如何从自参考模型建立ul-li层次结构,python,django,tree,hierarchy,Python,Django,Tree,Hierarchy,我有一个这样的模型 class Unit(models.ModelForm): Name = models.CharField(max_length = 100) Parent = models.ForeignKey('self' , on_delete=models.CASCADE , related_name = 'SubUnits') 我想在模板中显示带有ul和li的层次结构树。 首先,在views.py中,我传递了所有没有父对象的单元,这些单元被视为根对象,然后通过一

我有一个这样的模型

class Unit(models.ModelForm):
    Name = models.CharField(max_length =  100)
    Parent = models.ForeignKey('self' , on_delete=models.CASCADE , related_name = 'SubUnits')
我想在模板中显示带有
ul和li
的层次结构树。 首先,在
views.py
中,我传递了所有没有父对象的单元,这些单元被视为根对象,然后通过一个自定义
过滤器标记
我要生成层次结构树

object1 ----|object 1.1 
            |object 1.2------| object 1.2.1
            |object 1.3 
objecte 2

object 3 ---| object 3.1
            | object 3.2---| object 3.2.1

在我的自定义标记中,我寻找一个可以为我的根对象生成无限父级和子级ulli的函数。

最后我找到了我的算法

models.py

class Hierarchy(models.Model):
    Name = models.CharField(max_length=255)
    Parent = models.ForeignKey('self' , on_delete=models.CASCADE , related_name='SubHierarchy' , null=True , blank=True)
    def __str__(self):
        return self.Name
my views.py:

#i pass root objects 
hierarchy = Hierarchy.objects.filter(Parent = None)
return render(request , 'index.html' , {
   'hierarchy' : hierarchy
 })
模板:

 {% for unit in hierarchy %}
   {{unit|hierarchy|safe}}
 {% endfor %}
和我的过滤器:

def assitant(obj):
    string = ''
    childs = obj.SubHierarchy.all()
    if childs.count() == 0:
        string = '<li>{}</li>'.format(obj)
    else:
        string += hierarchy(obj)

    return string


@register.filter
def hierarchy(unit):
    childs = unit.SubHierarchy.all()
    if childs.count() == 0:
        string = '<li>{}</li>'.format(unit)
    else:
        string = '<li>{}<ul>'.format(unit)
        for child in childs:
            string += assitant(child)
        string += '</ul></li>'
    return string
def助手(obj):
字符串=“”
childs=obj.SubHierarchy.all()
如果childs.count()==0:
字符串='
  • {}
  • '.格式(obj) 其他: 字符串+=层次结构(obj) 返回字符串 @寄存器过滤器 def层次结构(单位): childs=unit.SubHierarchy.all() 如果childs.count()==0: 字符串=“
  • {}
  • ”。格式(单位) 其他: 字符串=“
  • {}
      ”。格式(单位) 对于儿童中的儿童: 字符串+=助手(子项) 字符串+='
  • ' 返回字符串
    看看这个答案是否有用-