Django - 在全球范围内存储一些值

时间:2017-01-18 12:09:31

标签: django

我想在我的数据库中存储全球数量的网站。在我的索引视图中,我有类似的东西:

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 }}

5 个答案:

答案 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

如果你想在每个模板中显示它,更好的办法是为此编写上下文处理器。