68

Django テンプレートを使用して HTML でレンダリングしたいメモリ内のツリー構造があります。

class Node():
  name = "node name"
  children = []

であり、のリストでrootあるオブジェクトがいくつかあります。テンプレートのコンテンツで渡されます。NodechildrenNoderoot

これをどのように達成するかについての議論を見つけましが、ポスターは、これは実稼働環境では良くない可能性があることを示唆しています.

誰かがより良い方法を知っていますか?

4

10 に答える 10

81

withテンプレートタグを使用して、ツリー/再帰リストを実行できました。

サンプルコード:

メイン テンプレート: 「all_root_elems」がツリーの 1 つ以上のルートのリストであると仮定

<ul>
{%for node in all_root_elems %} 
    {%include "tree_view_template.html" %}
{%endfor%}
</ul>

tree_view_template.html はネストされたをレンダリングしul、以下のようにテンプレート変数をli使用します:node

<li> {{node.name}}
    {%if node.has_childs %}
        <ul>
         {%for ch in node.all_childs %}
              {%with node=ch template_name="tree_view_template.html" %}
                   {%include template_name%}
              {%endwith%}
         {%endfor%}
         </ul>
    {%endif%}
</li>
于 2012-07-25T07:21:27.853 に答える
38

遅すぎます。
皆さんはタグで不必要なことをたくさん使っていますが、これは私が再帰的に行う方法です:

「メイン」テンプレートでは:

<!-- lets say that menu_list is already defined -->
<ul>
    {% include "menu.html" %}
</ul>

次にmenu.html

{% for menu in menu_list %}
    <li>
        {{ menu.name }}
        {% if menu.submenus|length %}
            <ul>
                {% include "menu.html" with menu_list=menu.submenus %}
            </ul>
        {% endif %}
    </li>
{% endfor %}
于 2015-10-26T07:31:07.580 に答える
28

標準的な答えは「しない」だと思います。

代わりにおそらくすべきことは、ビューコード内のことを解明することです。そのため、テンプレート内の (in|de)dents を反復処理するだけです。ツリーを再帰的にリストにインデントとデデントを追加し、その「旅行記」リストをテンプレートに送信することでそれを行うと思います。(テンプレートはそのリストから<li>andを挿入し</li>、それを「理解」して再帰構造を作成します。)

また、テンプレートファイルを再帰的に含めることは、実際には間違った方法だと確信しています...

于 2008-08-28T12:47:29.243 に答える
20

これは必要以上かもしれませんが、'mptt' と呼ばれる django モジュールがあります。これは、SQL データベースに階層ツリー構造を格納し、ビュー コードに表示するためのテンプレートを含みます。そこで役立つものを見つけることができるかもしれません。

ここにリンクがあります:django-mptt

于 2008-08-28T17:23:22.073 に答える
12

はい、できます。ファイル名を変数として {% include %} に渡すのはちょっとしたトリックです:

{% with template_name="file/to_include.html" %}
{% include template_name %}
{% endwith %}
于 2012-09-24T03:50:27.197 に答える
10

Django には、まさにこのシナリオのためのテンプレート ヘルパーが組み込まれています。

https://docs.djangoproject.com/en/dev/ref/templates/builtins/#unordered-list

于 2008-09-07T08:49:51.603 に答える
9

私は同じ問題を抱えていて、テンプレートタグを書きました。このようなタグが他にもあることは知っていますが、とにかくカスタムタグを作成する方法を学ぶ必要がありました:)かなりうまくいったと思います。

使用方法については、docstring を参照してください。

github.com/skid/django-recurse

于 2009-06-05T19:40:13.710 に答える
1

口述が好きな人はいませんか?ここで何かが欠けているかもしれませんが、メニューをセットアップする最も自然な方法のようです。キーをエントリとして使用し、値をリンクとして使用すると、DIV/NAV に表示されます。

あなたの拠点から

# Base.html
<nav>
{% with dict=contents template="treedict.html" %}
 {% include template %}
{% endwith %}
<nav>

これを呼び出す

# TreeDict.html
<ul>
{% for key,val in dict.items %}
 {% if val.items %}
  <li>{{ key }}</li>
  {%with dict=val template="treedict.html" %}
   {%include template%}
  {%endwith%}
 {% else %} 
  <li><a href="{{ val }}">{{ key }}</a></li>
 {% endif %}
{% endfor %} 
</ul>

デフォルトまたは注文されたものをまだ試していませんか?

于 2014-09-25T18:06:37.530 に答える
-2

同様の問題がありましたが、最初に JavaScript を使用してソリューションを実装し、その後、django テンプレートで同じことを行う方法を検討しました。

serializer ユーティリティを使用してモデルからリストを json に変換し、json データを階層の基礎として使用しました。

于 2008-09-03T12:25:19.000 に答える