Python Django应用程序中的全局视图上下文

Python Django应用程序中的全局视图上下文,python,django,django-templates,django-views,Python,Django,Django Templates,Django Views,目前,我有一个类,我在每个视图中调用它,用于模板中使用的一些全局上下文变量。看起来是这样的: class WikiContext(): def getWikiContext(self, view, request): context = { 'app': request.resolver_match.app_name, 'controller': view.__class__.__module__.split('.')[-1

目前,我有一个类,我在每个视图中调用它,用于模板中使用的一些全局上下文变量。看起来是这样的:

class WikiContext():
    def getWikiContext(self, view, request):
        context = {
            'app': request.resolver_match.app_name,
            'controller': view.__class__.__module__.split('.')[-1],
            'action': view.__class__.__name__.lower(),
            'categories': CategoryModel.objects.all()
        }

        return context
我在每个视图中都这样称呼它:

context = WikiContext().getWikiContext(self, request)

是否可以减少代码?如果可能,我不想在每个视图中重复调用。谢谢。

您可以使用。当呈现模板时,将自动加载它。因此,无需在每个视图中发出请求。

您可以使用。当呈现模板时,将自动加载它。因此,无需在每个视图中发出请求。

您可以在上下文处理器中执行此操作。做一些类似于:

def wiki_context_processor(request):
    return {
        'app': request.resolver_match.app_name,
        'controller': view.__class__.__module__.split('.')[-1],
        'action': view.__class__.__name__.lower(),
        'categories': CategoryModel.objects.all()
    }
然后,您可以将其添加到settings.py文件中的
模板\u上下文\u处理器中:

TEMPLATE_CONTEXT_PROCESSORS = (
    'myproject.context_processors.wiki_context_processor',
)

您可以在上下文处理器中执行此操作。做一些类似于:

def wiki_context_processor(request):
    return {
        'app': request.resolver_match.app_name,
        'controller': view.__class__.__module__.split('.')[-1],
        'action': view.__class__.__name__.lower(),
        'categories': CategoryModel.objects.all()
    }
然后,您可以将其添加到settings.py文件中的
模板\u上下文\u处理器中:

TEMPLATE_CONTEXT_PROCESSORS = (
    'myproject.context_processors.wiki_context_processor',
)

是的,在Nuchimik告诉我关于上下文处理器的事情后我做了。目前我不知道如何在那里获得视图对象。你知道吗?你什么意思?应该将该上下文添加到每个视图中。“view.\uuuu class.\uuu.\uuu module.\uuu.split('.')[-1]”,我不能在我的上下文处理器中调用它,因为“view”对象不存在。我明白了。我没有注意到你使用的魔法方法。我不知道如何在上下文处理器中访问它们。是的,在Nuchimik告诉我上下文处理器之后,我做了。目前我不知道如何在那里获得视图对象。你知道吗?你什么意思?应该将该上下文添加到每个视图中。“view.\uuuu class.\uuu.\uuu module.\uuu.split('.')[-1]”,我不能在我的上下文处理器中调用它,因为“view”对象不存在。我明白了。我没有注意到你使用的魔法方法。我不知道如何在上下文处理器中访问它们。泰,帮了我很多。你知道我怎样才能在那里得到我的视图对象吗。我想返回当前调用的视图(类)及其方法。@bonblow我阅读了下面的注释。对不起,我没有看到你用什么方法。您能在会话中保存此对象吗?我不确定在会话中存储对象是否是一种好的做法,但我认为这可以帮助你。泰,帮了我很多。你知道我怎样才能在那里得到我的视图对象吗。我想返回当前调用的视图(类)及其方法。@bonblow我阅读了下面的注释。对不起,我没有看到你用什么方法。您能在会话中保存此对象吗?我不确定在会话中存储对象是否是一种好的做法,但我认为这可以帮助您。