ナビゲーション メニューで現在のページを強調表示したい。明らかに、ページにいるときにメニューリンクに「アクティブ」などのクラスを与える必要があります。これは古典的な問題であり、多くの解決策が提案されているのを見てきました。私の問題は、それらすべてが嫌いで、どれも非常に乾燥しているとは考えていないことです. 例えば:
@register.simple_tag
def active(request, pattern):
import re
if re.search(pattern, request.path):
return 'active'
return ''
----
{% load tags %}
<div id="navigation">
<a class="{% active request "^/about/" %}" href="/about/">About</a>
<a class="{% active request "^/contact/" %}" href="/contact/">Contact</a>
<a class="{% active request "^/services/" %}" href="/services/">Services</a>
</div>
このタグは、現在のリクエストと URL 式を受け取り、現在このページにいる場合は「アクティブ」を返します。別の方法として、URL ではなく名前付きビューを使用してこれを行うこともできますが、原則は同じです。
これに関する私の主な問題は、ビューの 99% でナビゲーションが呼び出されることですが、現在のリクエスト変数を取得するために、次のようなテンプレートへの RequestContext を解析する必要があります。
def contact(request):
# snip ...
return render_to_response(
'contact.html',
{ 'myvar' : myvar },
context_instance=RequestContext(request))
現在の url/view を取得してアクティブなリンクを強調表示するために、おそらく 1 つを除くすべてのビューにrequest 変数が必要な場合に、この context_instance 行をすべてのビューに追加する必要があるのはなぜですか? これは、特に大多数の django サイトになければならない機能の場合、非常に湿っているように見えます。リクエストをデフォルトで含め、オプションで抑制できるようにしたい。ビューがテンプレートを返した後にレンダリングされる前にテンプレートをインターセプトできないため、ミドルウェアでこれを行う方法が見つかりません。
助言がありますか?