1

我想在我的网站上有一个菜单。我希望这个菜单可以通过 django admin 进行编辑。所以,我需要为它创建一个模型。

为菜单创建模型后,我可以在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

是的,创建一个上下文处理器,您的菜单将在每个页面上可用

在您的一个应用程序中创建一个文件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

好的,Timmy 向您推荐了一种 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 回答