使用django的站点菜单

imk*_*ost 1 python django menu

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

一旦我为我的菜单创建了模型,我就可以在我的views.py中使用它:

def main(request):
    menu_items = MenuItem.objects.all()
    return direct_to_template(request, 'main.html', {'menu_items': menu_items})
Run Code Online (Sandbox Code Playgroud)

没关系.但是......等一下......如果我有几页,它看起来像:

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})`
Run Code Online (Sandbox Code Playgroud)

有没有办法在每次创建新功能时不写相同的代码?

Tim*_*ony 7

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

在其中一个应用程序中创建一个文件menu_context_processor.py(或类似)

from myapp.models import MenuItem
def menu(request):
    return {'menu': MenuItem.objects.all() }
Run Code Online (Sandbox Code Playgroud)

并将其添加到您的TEMPLATE_CONTEXT_PROCESSOR设置中settings.py

TEMPLATE_CONTEXT_PROCESSORS = (
    ...,
    'myapp.menu_context_processor.menu'
)
Run Code Online (Sandbox Code Playgroud)

现在,在每个模板中,您都可以访问{{ menu }}.这些用于{{ STATIC_URL }}在整个应用程序中为您提供`{{MEDIA_URL}}',对于您希望包含在各处的变量非常有用.