在Django 1.6中的模板中全局访问对象

时间:2014-04-21 13:18:15

标签: django django-templates django-views

我想在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

这样做的好方法是什么?中间件?模板标签?

1 个答案:

答案 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哪里返回带有菜单项和子项(字典?)的对象,请记住,而不是pathuserrequest中的其他信息。

然后在应用设置模板上下文处理器中包含您的自定义处理器:

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对象。

不要对术语感到恐慌,这并不困难,这是正确的方法。