10

我想使用 JavaScript InfoVis Tooljit ( http://thejit.org ) 在 django 中呈现 mptt 节点树。如何在 django 中创建所需的 json 结构(参见http://thejit.org/static/v20/Jit/Examples/Spacetree/example1.code.html示例)?

谢谢

4

5 回答 5

7

如果您使用 django-mptt 的模板功能来生成 JSON 数据,您应该能够执行以下操作:

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

子标签非常棒,基本上为节点的每个子节点调用递归树。但是,此解决方案在逗号周围会产生一些混乱,因为 mptt 示例是围绕列表元素,这些元素不是问题。

稍大一点的代码解决了这个问题:

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

通过区分不位于数组中而是分配给变量的根节点(假设只有一个),与位于另一个节点的子节点中的其他节点相比,var x = y,可以避免该问题。

children: [x,y,z,]尾随逗号仍然存在问题。如果最后的逗号引发错误,那么在调用模板的视图中,您始终可以进行快速字符串替换以替换,]]

或者,您可以{{ children }}以某种方式更改 mptt 的调用以获取连接字符串,但这将涉及更多工作。

于 2011-04-13T13:25:13.923 回答
2

创建没有尾随逗号问题的 JSON:

{% full_tree_for_model YOUR_APP.YOUR_MODEL as nodes %}

var json =  {% for genre,structure in nodes|tree_info %}{% if structure.new_level %} [{ {% else %} },{ {% endif %}
id: "{{ genre.id }}",
children: {% if genre.is_leaf_node %}[]{% endif %}
{% for level in structure.closed_levels %}}]{% endfor %}{% endfor %}
于 2012-03-06T11:31:57.657 回答
2

如果有人正在寻找基于带有recursetree标签的模板的解决方案,则可以使用get_next_sibling逗号来控制。改编 Chris 提供的示例:

{% load mptt_tags %}
[
{% recursetree nodes %}
{
    "id": "{{ node.id }}",   
    "name": "{{ node.name }}",   
    "data": {},   
    "children": [{{ children }}]
}{% if node.get_next_sibling %},{% endif %}
{% endrecursetree %}
]
于 2021-01-13T16:02:47.760 回答
0

如果您想编写自己的序列化程序或从视图中执行此操作,您可以执行以下操作:

from mptt.templatetags.mptt_tags import cache_tree_children

queryset = Foo.objects.all().select_related('bar')
queryset = cache_tree_children(queryset)

现在查询集是“缓存的”,这意味着您可以使用模型 API 方法,get_children()而无需再次访问数据库。

于 2013-03-08T01:29:21.330 回答
0

我在这个线程中找到了一个用子数据渲染子数据的好方法:使用 mptt 创建 JSON 以反映 Python / Django 中的树结构的最快方法(参见 craigds 接受的答案)。他的方法还缓存结果并使用内置的 json.dumps 来创建结构。

于 2015-01-24T21:13:32.277 回答