0

i have a model like this

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

i want to show hierarchy tree with ul and li in the template. first of all in the views.py i passed all Units with no parent which considered as Root Objects and then with a custom filter tag i want to generate hierarchy ul li tree

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

in my custom tag i looks for a function that can generate infinite parent and child ul li for my root object.

Arash
  • 281
  • 3
  • 12
  • See if this answer helps - https://stackoverflow.com/questions/32044/how-can-i-render-a-tree-structure-recursive-using-a-django-template/11644588#11644588 – Rohan Jun 22 '17 at 05:25

1 Answers1

1

finally i find my algorithm

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
 })

template :

 {% for unit in hierarchy %}
   {{unit|hierarchy|safe}}
 {% endfor %}

and my filter :

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
Arash
  • 281
  • 3
  • 12