0

私の Django プロジェクトには、Web サイトの別々の部分に対応する 3 つのアプリがあります。3 つの部分はすべて、共通の base.html テンプレートで定義されたナビゲーション メニューからアクセスできます。

サイトのアクティブな部分に対応するメニュー オプションに「アクティブな」css クラスを追加するために、テンプレートを呼び出したアプリを特定できるようにしたいと考えています。

各ビューを変更して追加の変数をテンプレートに渡す以外に、それを行う最善の方法は何ですか?

4

3 に答える 3

2

最も非侵襲的な方法は次のとおりです。

  1. メニューを生成するテンプレート タグを記述します。
  2. アプリケーション名でコンテキストを更新します。
  3. これをテンプレート タグに渡し、それに応じて 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 を変更できます。

于 2012-09-26T08:10:57.927 に答える
0

別のテンプレートでナビゲーション メニューを定義する場合は、追加のコンテキストを含めることができます。

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>
于 2012-09-26T08:00:56.660 に答える
0

{%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%}
于 2012-09-26T07:41:23.737 に答える