[英]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.