なぜ地球上で私の回答のすべてにRequestContextのを渡すために、私が持っているのですか?

StackOverflow https://stackoverflow.com/questions/1052317

質問

私は、ナビゲーションメニューで現在のページをハイライト表示します。もちろん、私はあなたが自分のページ上にあるとき、「アクティブ」のようなクラスをリンクメニューを与える必要があります。これは古典的な問題であり、私は多くのソリューション提案のを見てきました。私の問題は、私はそれらのすべてを憎み、非常に乾燥すること、それらのどれを考慮していないです。たとえばます:

@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))

私はおそらく、すべてのそれらのいずれかが、私の意見のひとつひとつの1に、このcontext_instance行を追加する必要があるのですが、は必要なぜのアクティブを強調するために、現在のURL /ビューを取得するためのリクエスト変数リンク?これは特に、Djangoのサイトの大多数であることが必要な特徴のために、ひどく濡れたようです。私は、要求がデフォルトで含まれるようにしたいと、それを抑制随意することができます。私は前に私はテンプレートを傍受することはできませんとして、ミドルウェアでこれを行うための方法を見つけることができませんそのレンダリングされたビューは、それを返した後でます。

任意の提案ですか?

役に立ちましたか?

解決

あなたの意図は理にかなっている、あなたはそれが安全にパフォーマンス上の理由から省略することができる唯一のことはほとんど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 })

...またはrender_toからデコレータジャンゴ - 迷惑するます:

from annoying.decorators import render_to

@render_to('template.html')
def foo(request):          
    bar = Bar.object.all()  
    return {'bar': bar}     

他のヒント

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

ここに私の答えを参照してください:<のhref = "https://stackoverflow.com/questions/1024168/django-is-there-a-better-way-to-bold-the-current-page-link/1024214 #1024214" > Djangoは:例えば太字現在のページリンクのに良い方法はあります

今後の参考のために、一つはOPが望んでやっては、ジャンゴ・タブを使用することができますます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top