5

ナビゲーション メニューで現在のページを強調表示したい。明らかに、ページにいるときにメニューリンクに「アクティブ」などのクラスを与える必要があります。これは古典的な問題であり、多くの解決策が提案されているのを見てきました。私の問題は、それらすべてが嫌いで、どれも非常に乾燥しているとは考えていないことです. 例えば:

@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 サイトになければならない機能の場合、非常に湿っているように見えます。リクエストをデフォルトで含め、オプションで抑制できるようにしたい。ビューがテンプレートを返した後にレンダリングされる前にテンプレートをインターセプトできないため、ミドルウェアでこれを行う方法が見つかりません。

助言がありますか?

4

3 に答える 3

16

あなたの意図は理にかなっています。RequestContextほとんどの場合必要であり、パフォーマンス上の理由から安全に省略できることはめったにありません。解決策は、ショートカットをrender_to_response使用する代わりに簡単です。direct_to_template

from django.views.generic.simple import direct_to_template

def contact(request):
    # snip ...
    return direct_to_template(request, 'contact.html', { 'myvar' : myvar })

...またはdjangoのrender_toデコレータ-迷惑

from annoying.decorators import render_to

@render_to('template.html')
def foo(request):          
    bar = Bar.object.all()  
    return {'bar': bar}     
于 2009-06-27T14:23:10.867 に答える
1

現在のナビゲーションに別のスタイルを与えるために、必ずしもナビゲーションのマークアップに何かをする必要はありません。CSS を使用してそれを行う宣言的な方法があります。

ここで私の答えを参照してください: Django: Is there a better way to bold the current page link for example.

于 2009-06-27T07:42:29.100 に答える
0

将来の参考のために、OPが望んでいたことを行うためにdjango-tabsを使用できます。

于 2011-02-10T12:42:51.987 に答える