私の Django プロジェクトには、Web サイトの別々の部分に対応する 3 つのアプリがあります。3 つの部分はすべて、共通の base.html テンプレートで定義されたナビゲーション メニューからアクセスできます。
サイトのアクティブな部分に対応するメニュー オプションに「アクティブな」css クラスを追加するために、テンプレートを呼び出したアプリを特定できるようにしたいと考えています。
各ビューを変更して追加の変数をテンプレートに渡す以外に、それを行う最善の方法は何ですか?
私の Django プロジェクトには、Web サイトの別々の部分に対応する 3 つのアプリがあります。3 つの部分はすべて、共通の base.html テンプレートで定義されたナビゲーション メニューからアクセスできます。
サイトのアクティブな部分に対応するメニュー オプションに「アクティブな」css クラスを追加するために、テンプレートを呼び出したアプリを特定できるようにしたいと考えています。
各ビューを変更して追加の変数をテンプレートに渡す以外に、それを行う最善の方法は何ですか?
最も非侵襲的な方法は次のとおりです。
カスタム テンプレート タグの記述については、django のドキュメントで詳しく説明されているので、2 番目のビットについて説明します。
コンテキストを更新するには; ミドルウェアが必要です。これはあなたが必要とすることをするはずです:
class SetApplicationName(object):
def process_view(self, request, view_func, view_args, view_kwargs):
request.current_app = view_func.__module__.split('.')[0]
これを django が見つけられる場所 ( の任意のディレクトリPYTHONPATH
) に配置し、ミドルウェア クラスに追加します。また、django.core.context_processors.request
テンプレート コンテキスト プロセッサにあることを確認してください。
テンプレートには{{ request.current_app }}
、アプリ名を指す必要があるものがあります。
テンプレート タグは のようなものである必要が{% navigation_menu request.current_app %}
あり、それに応じてメニュー css を変更できます。
別のテンプレートでナビゲーション メニューを定義する場合は、追加のコンテキストを含めることができます。
base.html:
{% block navigation %}Here will be navigation{% endblock %}
template_from_some_app.html:
{% extends "base.html" %}
{% block navigation %}
{% include "navigation.html" with active_app='second_app' %}
{% endblock %}
ナビゲーション.html:
<ul class="nav">
<li {% if active_app == 'first_app' %} class="active">{% endif %}>
First app
</li>
<li {% if active_app == 'second_app' %} class="active">{% endif %}>
Second app
</li>
<li {% if active_app == 'third_app' %} class="active">{% endif %}>
Third app
</li>
</ul>
{%block%} タグを「オーバーライド」してみます。
base.html テンプレートに次のようなものを入れます。
{%block navigation_bar%}
<div class="regular">First app</div>
<div class="regular">Second app</div>
<div class="regular">Third app</div>
{%endblock%}
子孫テンプレートで、その naviitation_bar ブロックを他のものに変更します。first_app_base.html は次のようになります。
{%extends "base.html"%}
{%block navigation_bar%}
<div class="active">First app</div>
<div class="regular">Second app</div>
<div class="regular">Third app</div>
{%endblock%}