【问题标题】:Reuse context in multiple views [duplicate]在多个视图中重用上下文 [重复]
【发布时间】:2021-10-08 11:35:23
【问题描述】:

我对 Django 很陌生,在我的应用程序中,我在顶部有一个动态导航栏。上下文作为上下文传入。想象一下它看起来像这样:

<ul>
    {% for link in links %}
    <li><a href="{{ link }}"></a></li>
    {% endif %}
</ul>

视图可能如下所示:

def nav_links():
    # Display links to first 5 MyModel objects
    objects = MyModel.objects.all()[:5]
    return [o.get_absolute_url() for o in objects]

def index(request):
    return render("request", "app/index.html", context={"links": nav_links()})

def page1(request)
    some_data = ...
    return render("request", "app/page1.html", context={"links": nav_links(), "data": some_data})

def page2(request)
    return render("request", "app/page2.html", context={"links": nav_links()})

...

目前,我需要在每个视图中传递 links 作为上下文。这显然是糟糕的设计。

有没有办法为所有视图传递相同的上下文?

【问题讨论】:

  • 确实如此 - 谢谢!给他人的便条;相关问题中接受的答案未针对 Django 3 更新。(只是 context_processors 注册方式的不同 - 概念相同)

标签: django


【解决方案1】:

您可以使用上下文处理器,这是一个每次运行以填充上下文的函数。这种上下文处理器看起来像你的nav_links,除了它应该是一个带有变量名和相应值的字典:

# app_name/context_processors.py

def links(request):
    from app_name.models import MyModel
    objects = MyModel.objects.all()[:5]
    return {'links': [o.get_absolute_url() for o in objects]}

然后您可以在settings.py 中注册上下文处理器:

# settings.py

# …

TEMPLATES = [
    {
        # …,
        'OPTIONS': {
            'context_processors': [
                # …,
                'app_name.context_processors.links'
            ],
        },
    },
]

【讨论】:

  • 非常整洁,谢谢!
猜你喜欢
  • 1970-01-01
  • 2023-04-02
  • 1970-01-01
  • 2013-01-27
  • 2015-11-09
  • 1970-01-01
  • 1970-01-01
  • 2016-09-09
  • 1970-01-01
相关资源
最近更新 更多