1

Webサイトにメニューが欲しい。このメニューをdjangoadminで編集できるようにしたいと思います。そのため、そのモデルを作成する必要があります。

メニューのモデルを作成したら、views.pyで使用できます。

def main(request):
    menu_items = MenuItem.objects.all()
    return direct_to_template(request, 'main.html', {'menu_items': menu_items})

大丈夫です。しかし...ちょっと待ってください...私が複数のページを持っている場合、それは次のようになります:

def main(request):
    menu_items = MenuItem.objects.all()
    return direct_to_template(request, 'main.html', {'menu_items': menu_items})

def page1(request):
    menu_items = MenuItem.objects.all()
    return direct_to_template(request, 'page1.html', {'menu_items': menu_items})

def page2(request):
    menu_items = MenuItem.objects.all()
    return direct_to_template(request, 'page2.html', {'menu_items': menu_items})`

新しい関数を作成するたびに同じコードを記述しない方法はありますか?

4

2 に答える 2

8

はい、コンテキストプロセッサを作成すると、メニューがすべてのページで利用できるようになります

アプリの1つに、ファイルmenu_context_processor.py(または同様のもの)を作成します

from myapp.models import MenuItem
def menu(request):
    return {'menu': MenuItem.objects.all() }

TEMPLATE_CONTEXT_PROCESSORで設定に追加しますsettings.py

TEMPLATE_CONTEXT_PROCESSORS = (
    ...,
    'myapp.menu_context_processor.menu'
)

これで、すべてのテンプレートでにアクセスできるようになり{{ menu }}ます。これらは{{ STATIC_URL }}、アプリケーション全体で「{{MEDIA_URL}}」を利用できるようにするために使用され、どこにでも含めたい変数に役立ちます。

于 2012-04-18T18:50:04.320 に答える
3

わかりました、ティミーはあなたにDjangoの方法を提案しました、そしてそれは素晴らしい働きをします。ちなみに、私はあなたがこのようなデコレータを使うことができるpythonicの方法を知っています:

def apply_menu(func):
    def wrapper(*args, **kwargs):
        request = args[0]
        menu_items = MenuItem.objects.all()
        vars = {'menu_items': menu_items}
        if kwargs:
            page, template_var = func(*args, **kwargs)
        else: page, template_var = func(*args)
        vars.update( template_var)
        return return direct_to_template(request, page, vars)
    return wrapper

そして、次のようにデコレータを使用します。

@apply_menu
def main(request):
    your_extra_vars = {}
    return 'main.html', your_extra_vars
于 2012-04-18T19:53:16.333 に答える