base.html
プロジェクトを他のテンプレートによって拡張されたテンプレートに編成した場合、たとえばappname/pagename.html
、テンプレート中心のアプローチを使用して、アクティブなナビゲーション要素を強調表示できます。
このアプローチには、いくつかのデカップリングの利点があります。これについては、この回答の最後で詳しく説明しました。
このアプローチは、サイトのほとんどまたはすべてで同じままである幅広いナビゲーションアイテムを処理するのに非常に役立つことがわかりました。データストアから収集したアイテムの動的リストをレンダリングするなど、より詳細なナビゲーション要素にはおそらく適切なソリューションではありません。
テンプレートで、base.html
各ナビゲーション要素にブロックを追加し、ブロックに一意の名前を付けます。
<ul class="nav">
<li class="{% block navbar_class-home %}{% endblock %}">
<a href="#">Home</a>
</li>
<li class="{% block navbar_class-about %}{% endblock %}">
<a href="#">About</a>
</li>
<li class="{% block navbar_class-pricing %}{% endblock %}">
<a href="#">Pricing</a>
</li>
</ul>
テンプレートで、appname/pagename.html
nav要素の1つをアクティブに見せたい場合はactive
、コンテンツとして使用して適切なブロックをオーバーライドします。たとえば、「About」アイテムを強調表示するには、次のようにします。
{% block navbar_class-about %} active {% endblock %}
そのテンプレートをレンダリングするビューを使用すると、次のようにレンダリングされます。
<ul class="nav">
<li class="">
<a href="#">Home</a>
</li>
<li class=" active ">
<a href="#">About</a>
</li>
<li class="">
<a href="#">Pricing</a>
</li>
</ul>
これにより、JavaScriptに依存しない初期レンダリングが提供されます。(シングルページアプリを実行している場合は、JavaScriptを使用してナビゲーションバークラスを変更できます。)
多くの場合(すべてではありません)、これはビューロジックからのより良い分離プレゼンテーションになる可能性があります。
ビューを変更してサイトナビゲーションデータをテンプレートコンテキストに添付することはできますが、そうすると、プレゼンテーションがビューレイヤーに強力に結合され、再利用可能なアプリの作成やサードパーティのアプリの統合がより困難になります。
ビューはすでに名前付きテンプレートを選択しています。これは、ナビゲーション関連の情報をテンプレートレイヤーに既に渡していることを意味します。必要なのはそれだけかもしれません。
テンプレートコンテキストプロセッサを使用してビューに関する情報を取得できますが、これにより、テンプレートレイヤー内にとどまるのではなく、システムの別のレイヤーに強力な結合が移動します。