2017-06-22 8 views
0

私はテンプレート内ul and liで階層ツリーを表示したいこのDjangoの自己参照モデルからのULのli hierachyを作るためにどのように

class Unit(models.ModelForm): 
    Name = models.CharField(max_length = 100) 
    Parent = models.ForeignKey('self' , on_delete=models.CASCADE , related_name = 'SubUnits') 

ようなモデルを持っています。 views.py内のすべての最初の iは、ルートオブジェクトとして考えると、私は私のカスタムタグで階層のULのliツリー

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 

を生成するカスタムfilter tagと私は機能を探していない親を持つすべてのユニットを通過したこと私のルートオブジェクトに対して無限の親と子のul liを生成できます。

+0

この回答が役立つかどうかを確認する - https://stackoverflow.com/questions/32044/how-can-i-render-a-tree-structure-recursive-using-a-django-template/11644588# 11644588 – Rohan

答えて

0

は最終的に私は私のアルゴリズム

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 

私の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