簡體   English   中英

使用Django的站點菜單

[英]Site menu using django

我想要網站上的菜單。 我希望通過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})`

有什么方法可以在我每次創建新函數時不編寫相同的代碼嗎?

是的,創建一個上下文處理器 ,您的菜單將出現在每個頁面上

在您的一個應用程序內部創建一個文件menu_context_processor.py (或類似文件)

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

並將其添加到settings.py TEMPLATE_CONTEXT_PROCESSOR設置中

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

現在,在每個模板中,您都可以訪問{{ menu }} 它們用於使{{ STATIC_URL }}和`{{MEDIA_URL}}'在整個應用程序中都可以使用,並且對於要包含在所有地方的變量很有用。

好的,蒂米(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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM