Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can create a json tree from django-mptt?

I want to use the JavaScript InfoVis Tooljit ( http://thejit.org ) to render a tree of mptt nodes in django. How can i create the required json structure (see http://thejit.org/static/v20/Jit/Examples/Spacetree/example1.code.html for an example) in django?

Thanks

like image 788
sean2000 Avatar asked Feb 21 '11 23:02

sean2000


2 Answers

If someone is looking for a solution based on templates with the recursetree tag, it is possible to use get_next_sibling to control commas. Adapting the example provided by Chris:

{% load mptt_tags %}
[
{% recursetree nodes %}
{
    "id": "{{ node.id }}",   
    "name": "{{ node.name }}",   
    "data": {},   
    "children": [{{ children }}]
}{% if node.get_next_sibling %},{% endif %}
{% endrecursetree %}
]
like image 151
regiov Avatar answered Oct 29 '22 00:10

regiov


If you use the template functionality of django-mptt to generate the JSON data you should be able to do something like the following:

var json =    
{% recursetree nodes %}
{
    id: "{{ node.id }}",   
    name: "{{ node.name }}",   
    data: {},   
    children: [{{ children }}]
},
{% endrecursetree %}

The children tag is brilliant, basically calling recursetree for each child of the node. However there is a little messiness generated around commas with this solution as the mptt example is around list elements where such things aren't a problem.

A slightly larger bit of code solves this:

var json =    
{
    id: "{{ root.id }}",   
    name: "{{ root.name }}",   
    data: {},   
    children: [{% recursetree root.children %}
    {
        id: "{{ node.id }}",   
        name: "{{ node.name }}",   
        data: {},   
        children: [{{ children }}]
    }
    {% endrecursetree %}]
}

By making a distinction between the root node (presuming there is only one) which does not reside within an array but is instead assigned to a variable, compared to other nodes which live within the children of another node, the var x = y, issue is avoided.

There is still a problem with children: [x,y,z,] having a trailing comma. If that final comma is raising errors then in the view that has called the template you can always do a quick string replace to replace ,] with ]

Alternatively you could alter the {{ children }} call of mptt in some way to take a join string, but that would involve much more work.

like image 28
Chris Avatar answered Oct 29 '22 01:10

Chris