JavaScript InfoVis Tooljit ( http://thejit.org ) を使用して、django で mptt ノードのツリーをレンダリングしたいと考えています。django で必要な json 構造 (例についてはhttp://thejit.org/static/v20/Jit/Examples/Spacetree/example1.code.htmlを参照) を作成するにはどうすればよいですか?
ありがとう
JavaScript InfoVis Tooljit ( http://thejit.org ) を使用して、django で mptt ノードのツリーをレンダリングしたいと考えています。django で必要な json 構造 (例についてはhttp://thejit.org/static/v20/Jit/Examples/Spacetree/example1.code.htmlを参照) を作成するにはどうすればよいですか?
ありがとう
django-mptt のテンプレート機能を使用して JSON データを生成する場合、次のようなことができるはずです。
var json =
{% recursetree nodes %}
{
id: "{{ node.id }}",
name: "{{ node.name }}",
data: {},
children: [{{ children }}]
},
{% endrecursetree %}
children タグは素晴らしく、基本的にノードの各子に対して recursetree を呼び出します。ただし、mptt の例は、そのようなことが問題にならないリスト要素の周りにあるため、このソリューションではコンマの周りに少し乱雑さが生成されます。
少し大きなコードでこれを解決します。
var json =
{
id: "{{ root.id }}",
name: "{{ root.name }}",
data: {},
children: [{% recursetree root.children %}
{
id: "{{ node.id }}",
name: "{{ node.name }}",
data: {},
children: [{{ children }}]
}
{% endrecursetree %}]
}
別のノードの子内に存在する他のノードと比較して、配列内に存在せず、代わりに変数に割り当てられているルート ノード (1 つしか存在しないと仮定) を区別することで、このvar x = y,
問題は回避されます。
children: [x,y,z,]
末尾のコンマがあると、まだ問題があります。その最後のコンマがエラーを引き起こしている場合、テンプレートを呼び出したビューで、いつでも簡単な文字列置換を実行して次の文字列に置き換えることができ,]
ます]
あるいは{{ children }}
、mptt の呼び出しを何らかの方法で変更して結合文字列を取得することもできますが、それにはさらに多くの作業が必要になります。
末尾のコンマの問題なしで 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 %}
独自のシリアライザーを作成する場合、またはビューからこれを実行する場合は、次のことができます。
from mptt.templatetags.mptt_tags import cache_tree_children
queryset = Foo.objects.all().select_related('bar')
queryset = cache_tree_children(queryset)
これで、クエリセットは「キャッシュ」されますget_children()
。つまり、データベースに再度アクセスすることなく、モデルAPIメソッドを使用できます。
このスレッドでサブデータを使用して子供をレンダリングするための優れたソリューションを見つけました: mptt を使用して Python/Django でツリー構造を反映する JSON を作成する最速の方法(craigds によって受け入れられた回答を参照)。彼のメソッドは結果もキャッシュし、組み込みの json.dumps を使用して構造を作成します。