3

次のようなリストを生成しようとしています。

<ul>
    <li>Parent 1
        <ul>
            <li>Child 1</li>
            <li>Child 2</li>
            <li class="last">Child 3</li>
        </ul>
    </li>
    <li>Parent 2
        <ul>
            <li>Child 1</li>
            <li>Child 2</li>
            <li class="last">Child 3</li>
        </ul>
    </li>
    <li class="last">Parent 3
        <ul>
            <li>Child 1</li>
            <li>Child 2</li>
            <li class="last">Child 3</li>
        </ul>
    </li>
</ul>

私はもともとやった:

<ul>
    {% recursetree mytree %}
    <li class="{% if not node.get_next_sibling %}last{% endif %}">
        {{ node }}
        {% if not node.is_leaf_node %}
        <ul>
            {{ children }}
        </ul>
        {% endif %}
    </li>
</ul>

ただし、 を呼び出すと、node.get_next_siblingアイテムごとに追加のクエリが発生します。明らかに、それは理想的ではありません。だから私は最後の項目を決定するためにtree_infoandを使用しようとしました:structure.closed_levels

{% for node,structure in mytree|tree_info %}
    {% if structure.new_level %}<ul><li>{% else %}</li><li>{% endif %}
        <li class="{% if structure.closed_levels|length > 0 %}last{% endif %}">
            {{ node }}
    {% for level in structure.closed_levels %}</li></ul>{% endfor %}
{% endfor %}

これはうまく機能しますが、最後のルート レベルのアイテムstructure.closed_levelsは常に空のリストであるため、「最後の」クラスを取得しません。(実際には子アイテムに対してのみ機能します)。

同様のことを達成する必要があるのは私が最初ではないので、ここの誰かがすでに解決策を持っていることを願っています.

4

2 に答える 2

1

MPTT 注文情報から必要な情報を取得できるはずだと思います。これは、 MPTT の仕組みの良い紹介です(django-mptt のドキュメントからリンクされています)。重要なのは、親への参照を維持することです。そのため、ノードの「右」アトリビュートが親の「左」アトリビュートより 1 小さいかどうかを確認できます。

django-mptt は、複数のツリーを持つことができるように、ルート ノードを特殊なケースにします。単一のツリー内のノードを反復処理している場合、次のようなものが機能するはずです (ただし、テストしていません)。

<ul class="root">
    {% recursetree nodes %}
        <li class="{% if parent == None or node.rgt|plusone == parent.lft %}last{% endif %}">
            {{ node.name }}
            {% if not node.is_leaf_node %}
                {% with node as parent %}
                <ul class="children">
                    {{ children }}
                </ul>
                {% endwith %}
            {% endif %}
        </li>
    {% endrecursetree %}
</ul>

ただし、「ノード」がすべてのルートのリストを保持している場合は、それを明示的にキャッチする必要があります。このような何かがうまくいくはずです:

{% with nodes|last as lastnode %}
<ul class="root">
    {% recursetree nodes %}
        <li class="{% if node == lastnode or parent and node.rgt|plusone == parent.lft %}last{% endif %}">
            {{ node.name }}
            {% if not node.is_leaf_node %}
                {% with node as parent %}
                <ul class="children">
                    {{ children }}
                </ul>
                {% endwith %}
            {% endif %}
        </li>
    {% endrecursetree %}
</ul>
{% endwith %}

上記のコードが「plusone」テンプレート フィルターを参照していることに気付くでしょう。このようなことをする必要があります:

from django import template

register = template.Library()

@register.filter
def plusone(value):
    return value + 1

そうは言っても、これは私の好みには少し多すぎるテンプレート計算です。これを定期的に行っている場合は、カスタム テンプレート タグでまとめるのがおそらく賢明です。

于 2012-02-29T22:44:09.917 に答える
0

{{forloop.last}} または{{if 1 == forloop.revcounter}} 最後から2番目を使用する必要があります{{if 2 == forloop.revcounter}}

djangoロジックでクラスを追加するには...

:last-childスタイルを追加するだけの場合は、クラスを追加する代わりにcss selecotrs を使用できます

javascriptに必要でjqueryを使用している場合、jqueryで機能するcssセレクター

于 2013-02-12T14:15:08.727 に答える