我想在我的数据库中存储全球数量的网站。在我的索引视图中,我有类似的东西:
sites_inactive = Site.objects.filter(is_active=False)
sites_all = Site.objects.all()
context['sites_inactive'] = sites_inactive.count()
context['sites_all'] = sites_all.count()
我想在每个视图中访问这些变量。现在我必须在每个视图中重复我的代码。是否可以存储这些值并将其放在我的base.html文件中?我的意思是:
Number of sites: {{ sites_all }}
答案 0 :(得分:3)
如果您使用RequestContext向模板发送上下文,则可以write your own context processor将这些变量添加到上下文中,然后将其添加到“处理器”中。作为TEMPLATES
设置的一部分,变量将在每个模板中提供。
答案 1 :(得分:2)
通常,使用全局变量来丢弃代码是一个坏主意。您应该像RemcoGerlich已经建议的那样创建一个上下文处理器,但是不应该从全局中获取值,而应该依赖于缓存
def my_context_processor(request):
obj = cache.get('site_stats')
if not obj:
sites_inactive = Site.objects.filter(is_active=False)
sites_all = Site.objects.all()
obj = {'sites_inactive': sites_inactive.count(),
'sites_all']: sites_all.count()}
cache.set('site_stats',obj)
return obj
答案 2 :(得分:0)
这样做的一种方法是使用自定义ContextMixin
并在每个视图中使用它。自定义ContextMixin
应扩展get_context_data
功能。
class SiteMixin(ContextMixin):
def get_context_data(self, **kwargs):
context = super(SiteMixin, self).get_context_data(**kwargs)
# Edit context
return context
class MyView(SiteMixin, View):
pass
答案 3 :(得分:0)
我是这样做的。
processor.py
def my_context_processor(request):
return {'sites_all': Site.objects.all().count,
'sites_inactive': Site.objects.filter(is_active=False).count()}
settings.py
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [TEMPLATE_DIR, ],
'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',
'mainapp.processor.my_context_processor',
],
},
},
]
现在,我可以在我的应用中访问sites_all和sites_inactive。可以吗?
答案 4 :(得分:-1)
Django会话就是你要找的。您可以在会话中存储全局数据,并使用request.session.get('num_of_sites')
在每个视图中访问它。有关详细信息,请查看此link。
如果你想在每个模板中显示它,更好的办法是为此编写上下文处理器。