我想在Django 1.6中的所有页面上都有一个菜单。
在菜单中我还想包含我数据库中的一些对象。我知道我可以扩展ListView并获取对象,我知道我可以在get_context_data
中设置变量,但是如何在所有页面上使对象可用。我认为在每个视图中设置context_data都是愚蠢的。
我的菜单结果应该是:
Home
Users
User 1
User 2
User 3
Help
Questions
Question 1
Question 2
Question 3
About
这样做的好方法是什么?中间件?模板标签?
答案 0 :(得分:2)
您正在寻找自定义template context processor:
你应该写一个这样的函数:
#file: my_context_processors.py
def menu_data(request):
return {
'menu': calculate_menu( request ), #<-- menu is appended
# to your context
# for all templates
}
calculate_menu
哪里返回带有菜单项和子项(字典?)的对象,请记住,而不是path
,user
和request
中的其他信息。
然后在应用设置模板上下文处理器中包含您的自定义处理器:
TEMPLATE_CONTEXT_PROCESSORS = (
"django.contrib.auth.context_processors.auth",
"django.core.context_processors.debug",
#"django.core.context_processors.i18n",
"django.core.context_processors.media",
"django.core.context_processors.static",
"django.contrib.messages.context_processors.messages",
"django.core.context_processors.csrf",
'django.core.context_processors.request',
'my_app.my_context_processors.menu_data', #<---- here
)
目前,您的所有模板都可以使用menu
对象。
不要对术语感到恐慌,这并不困难,这是正确的方法。