I have a tree structure in memory that I would like to render in HTML using a Django template.
class Node():
name = "node name"
children = []
There will be some object root
that is a Node
, and children
is a list of Node
s. root
will be passed in the content of the template.
I have found this one discussion of how this might be achieved, but the poster suggests this might not be good in a production environment.
Does anybody know of a better way?
Django has a built in template helper for this exact scenario:
https://docs.djangoproject.com/en/dev/ref/templates/builtins/#unordered-list
I think the canonical answer is: "Don't".
What you should probably do instead is unravel the thing in your view code, so it's just a matter of iterating over (in|de)dents in the template. I think I'd do it by appending indents and dedents to a list while recursing through the tree and then sending that "travelogue" list to the template. (the template would then insert
<li>
and</li>
from that list, creating the recursive structure with "understanding" it.)I'm also pretty sure recursively including template files is really a wrong way to do it...
Using
with
template tag, I could do tree/recursive list.Sample code:
main template: assuming 'all_root_elems' is list of one or more root of tree
tree_view_template.html renders the nested
ul
,li
and usesnode
template variable as below:I had the same problem and I wrote a template tag. I know there are other tags like this out there but I needed to learn to make custom tags anyway :) I think it turned out pretty well.
Read the docstring for usage instructions.
github.com/skid/django-recurse