如何在 django 中声明一个数据库驱动的字典,该字典可在模板中全局访问,而不依赖于 views.py
Posted
技术标签:
【中文标题】如何在 django 中声明一个数据库驱动的字典,该字典可在模板中全局访问,而不依赖于 views.py【英文标题】:how to declare a database driven dictionary in django which is globally accessable in templates and not views.py dependent 【发布时间】:2013-11-28 18:18:14 【问题描述】:我需要声明一个数据库驱动的字典,可以在所有模板中全局访问,并且不应该依赖于视图,因为我需要它对所有模板全局访问。
写一个上下文处理器我累了
但是在 settings.py 中添加上下文处理器时
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.contrib.messages.context_processors.messages',
'django.core.context_processors.request',
'myapp.context_processors.myfunction",
)
它会不断加载多次。然后通过这个问题,我了解到上下文处理器通过 RequestContext 加载,所以当我多次调用 RequestContext 时,它一直在加载。
那么有没有一种方法我可以定义一次并且可以在模板中全局访问,这也不会影响我的网站性能
myfunction
会像:
from ipc.declarations.models import MainDeclaration
from django.shortcuts import get_object_or_404
def myfunction(request):
declarationId = 2991
declaration = get_object_or_404(MainDeclaration, pk=declarationId, user=request.user.id)
return 'sectionGlobal': declaration
【问题讨论】:
请粘贴“myfunction”的代码,我怀疑你可以使用缓存 为什么每次请求都要多次调用 RequestContext? 除了视图我还有annotations.py
我必须调用RequestContext
【参考方案1】:
上下文处理器有点被过度使用了……你现在知道为什么了。最好只将它们用于非常简单、轻量级的东西(链接注入设置等)。
允许模板访问视图未提供的数据的正确方法是编写自己的模板标签——在这种情况下,一个简单的赋值标签就足够了:
https://docs.djangoproject.com/en/1.6/howto/custom-template-tags/#assignment-tags
【讨论】:
是的,最初我是这么认为的,然后切换到上下文处理器。现在我接受了你的建议并尝试了它,效果很好:)以上是关于如何在 django 中声明一个数据库驱动的字典,该字典可在模板中全局访问,而不依赖于 views.py的主要内容,如果未能解决你的问题,请参考以下文章