Djangoテンプレートナビゲーション

おそらくすべてのプロジェクトにナビゲーションシステムがあります。ユーザーはリンク、メニューをクリックし、開発者/デザイナー/レイアウトデザイナーはユーザーが現在表示しているページ/リンクを何らかの方法で「強調」する必要があります。



Djangoプロジェクトでナビゲーションを開発するときに、非常に些細なタスクに対する非自明なソリューションを提供します。



忍耐強くない人のために、すぐにgithubプロジェクトを見ることができます。



最も些細な決定



コンテキストの各ビューでは、特定の変数を渡し、それを「場所」にして、容赦なくハードコードします。



<ul> <li {% if location=='random_page' %} class="active" {% endif %}> <a href="{% url 'random_page' %}"> {% trans 'random page' %} </a> </li> </ul>
      
      





各リンクには一意の「ロケーション」値があり、リンク\ビューがどの「ロケーション」をどのリンクに保存するのが非常に不可能になると、多くの余分なコードが生成され、タイプセッターはPythonロジックを掘り下げる必要性が非常に不満足になる可能性がありますビューと、コンテキストから取得する値。



このビューの名前リンクと同じ「場所」を渡すと、ナビゲーションが少し明確になります。



単純な「テンプレートフィルター」による実装



フィルター自体:



 from django import template register = template.Library() def active(url, request): if url == request.get_full_path(): return True else: return False register.filter('active', active)
      
      





テンプレートでさらに:



 {% load active %} <ul> {% url 'random_page' as random_page %} <li {% if random_page|active:request %} class="active" {% endif %}> <a href="{{ random_page }}"> {% trans 'random page' %} </a> </li> </ul>
      
      





ビューで変数を渡す必要はもうありません。比較を.startswith()で、または正規表現で置き換えて、メニューのサポートを追加できます。たとえば、ユーザーがページ「/ menu / submenu /」にいるときに「/ menu /」へのリンクを照らします。 しかし、ルーチンはまだここにあります...



私の自転車-django-activeurl



つまり、次のような日常的なアクションはありません。



 {% load activeurl %} {% activeurl %} <ul> <li> <a href="{% url 'random_page' %}"> {% trans 'random page' %} </a> </li> </ul> {% endactiveurl %}
      
      





いくつかの魔法...



 <ul> <li class="active"> <a href="/random_page/"> random page </a> </li> </ul>
      
      





すべてのPythonバッテリーのようなインストール:



 pip install django-activeurl
      
      





すべてのニュアンスをここで説明します



ここで、すべての仕組みについて少し説明します-lxmlを使用して送信されたhtmlからツリーを構築し、強調表示する必要があるHTML要素を検索し(デフォルトでは「li」)、すべてのリンクがこのタグで取得され、「href」パラメーターが比較されます「request.get_full_path()」を使用します。



実装された機能:





皆のためのより少ないルーチンタスク!



All Articles