3

私は、すべてのページの上にヘッダーを持つdjangoを使用してWebサイトを構築しています。これは基本的に、ページ全体で一定のいくつかのリンクを持つメニューです。

ただし、表示しているページによっては、「アクティブ」クラスを追加して、メニューの対応するリンクを強調表示したいと思います。そうするために、私は現在次のようにしています。各ページには、メニューを含まない一般的なレイアウト内に統合された完全なメニュー ブロックがあります。たとえば、page2 は次のようになります。

{% extends "layout.html" %}
{% block menu %}
<li><a href="{% url 'myapp:index' %}">Home</a></li>
<li><a href="{% url 'myapp:page1' %}">page1</a></li>
<li class="active"><a href="{% url 'myapp:page2' %}">page2</a></li>
<li><a href="{% url 'myapp:page3' %}">page3</a></li>
{% endblock %}

問題は、そのソリューションがあまりきれいではないことに加えて、ヘッダー メニューにリンクを追加するたびに、すべてのページを変更する必要があることです。これは最適とはほど遠いので、より良い方法について知っている人がいるかどうか疑問に思っていました.

前もって感謝します!

4

3 に答える 3

3

すべてのビューに「ページ」オブジェクトがある場合、ナビゲーション アイテムのスラッグとオブジェクトのスラッグを比較できます。

ナビゲーション.html

<ul>
    {% for page in navigation %}
        <li{% ifequal object.slug page.slug %} class="active"{% endifequal %}>
            <a href="{{ page.get_absolute_url }}">{{ page.title }}</a>
        </li>
    {% endfor %}
</ul>

base.html

<html>
    <head />
    <body>
        {% include "navigation.html" %}
        {% block content %}
            Welcome Earthling.
        {% endblock %}
    </body>
</html>

page.html

{% extends "base.html" %}

{% block content %}
    {{ object }}
{% endblock %}

ナビゲーションはおそらくcontext_processorすべてのページを保持する変数であり、オブジェクトは現在のPageDetailViewオブジェクト変数です

免責事項

Paulo が指摘したように、問題には多くの解決策があります。もちろん、このソリューションは、すべてのビューがページ オブジェクトを保持していることを前提としています。これは通常、CMSによって実装される概念です。ページ アプリから派生していないビューがある場合は、ナビゲーション内にページ プレダーを挿入する必要があります (少なくともget_absolute_urlandtitle属性を保持します)。

feinCMSこれは非常に良い学習体験になるかもしれませんが、ロードのインストール時間を節約するかdjango-cms、どちらApplicationContentも原則を定義することになるでしょう 。

于 2013-05-17T13:25:17.243 に答える