【问题标题】:Global View-Context in Django AppDjango App 中的全局视图上下文
【发布时间】:2017-09-26 02:00:59
【问题描述】:

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

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)

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

【问题讨论】:

    标签: python django django-templates django-views


    【解决方案1】:

    您可以使用a context processor。它会在模板渲染时自动加载。因此,无需在每个视图中都发出请求。

    【讨论】:

    • Ty,帮了我很多。你知道我怎样才能在那里得到我的视图对象吗?我想返回当前调用的视图(类)及其方法。
    • @bonblow 我读了下面的 cmets。对不起,我没有看到你使用什么方法。你能在会话中保存这个对象吗?我不确定在会话中存储对象是一种好习惯,但我认为这可以帮助您。
    【解决方案2】:

    您可以在上下文处理器中执行此操作。执行以下操作:

    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 文件中的TEMPLATE_CONTEXT_PROCESSORS:

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

    【讨论】:

    • 是的,在 Nuchimik 告诉我有关上下文处理器的信息后,我就这样做了。目前我不知道如何在那里获得视图对象。你知道吗?泰
    • 什么意思?该上下文应该添加到每个视图中。
    • "view.__class__.__module__.split('.')[-1]," 我不能在我的 context_processor 中调用它,因为那里不存在 "view" 对象。跨度>
    • 我明白了。我没有注意你使用的魔法方法。我不确定如何在上下文处理器中访问它们。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-04
    • 1970-01-01
    • 2014-01-08
    • 2012-04-23
    • 2012-08-17
    • 2021-06-27
    相关资源
    最近更新 更多