【问题标题】:Access Model Data from Django Base Template从 Django 基本模板访问模型数据
【发布时间】:2011-04-23 11:19:15
【问题描述】:

我有一个模型Category,我希望它的对象始终显示在我的base.html 模板的导航菜单中(我的所有其他模板都扩展了该模板)

我想学习最佳实践,因此想知道将这些数据提供给模板的正确/可接受的方式是什么。

【问题讨论】:

  • 当您说“我希望它的对象始终显示在菜单中”时,您是什么意思。你能举个例子吗?我可以想出很多方法来做到这一点。这只是为了给你确切的答案。
  • 抱歉,我没有说清楚。我想做的就是能够在我的主 ase 模板中以某种方式遍历 Category.objects.all() 。我将编辑这个问题,并用一个例子再次尝试措辞。谢谢。

标签: python django django-models django-templates


【解决方案1】:

使用自定义上下文处理器:

在 context_processors.py 中:

def categories(request):
    return {
        'categories': Categories.objects.all()
    }

并将其添加到您的 settings.py 中:

TEMPLATE_CONTEXT_PROCESSORS = (
    # ... django's default context processors
    "your_app.context_processors.categories", 
)

【讨论】:

  • 好主意,非常简洁的解决方案
  • 我刚刚在一个项目中使用过它,它是一个非常灵活和优雅的解决方案!然而,包含标签也是一个很好的解决方案
  • 小心点;只要 Django 应用程序没有重新加载,上下文处理器就不会刷新值,所以如果你想访问任何可能改变的东西,你应该使用模板标签。
【解决方案2】:

提醒任何使用更高版本 Django(即 1.9)的人:Django 定义其上下文处理器的方式已经改变。除了添加到 TEMPLATE_CONTEXT_PROCESSORS 之外,您只需在 Django 的上下文处理器列表中添加一行:

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
                'app.context_processors.your_processor', # CHANGE THIS
            ],
        },
    },
]

希望这会有所帮助!

【讨论】:

    【解决方案3】:

    您可以为类别创建一个custom tag 并将其放置在基本模板中。这样你就不必在每个视图的上下文中发送一个“类别”变量..

    祝你好运

    【讨论】:

    • +1 是一个很好的解决方案(我也会这样做),但您可能需要详细说明一下。
    • 啊,包含标签看起来可以帮到我。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-17
    • 1970-01-01
    • 2015-03-20
    • 1970-01-01
    • 2014-08-20
    • 2017-05-07
    • 2010-12-25
    相关资源
    最近更新 更多