我想在 Django 1.6 中的所有页面上都有一个菜单。
在菜单中,我还想包含数据库中的一些对象。我知道我可以扩展 ListView 并获取对象,并且我知道我可以在 get_context_data 中设置变量,但是如何使这些对象在我的所有页面上可用。我认为在每个 View 中设置 context_data 是愚蠢的。
我的菜单结果应该是这样的:
Home
Users
User 1
User 2
User 3
Help
Questions
Question 1
Question 2
Question 3
About
什么是好的方法呢?中间件?模板标签?
最佳答案
您正在寻找定制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
和其他信息放入 请求
。
然后将您的自定义处理器包含在应用设置模板上下文处理器中:
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
对象在您的所有模板上都可用。
不要对术语感到 panic ,这并不难,这就是正确的方法。
关于django - 在 Django 1.6 中的模板中全局访问对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23198254/