Python django-如何创建在多个视图中使用的对象(用于动态菜单)

Python django-如何创建在多个视图中使用的对象(用于动态菜单),python,django,Python,Django,我有一个包含在多个模板中的动态菜单。(sidebar.html) 但是我在这个应用程序中有大约9个视图,它们都需要这个菜单,我怎样才能重用数据,而不是为每个视图查询9次 谢谢在应用程序目录中创建一个文件context\u processors.py。在那里,创建一个函数,如 def add_sidebar_stuff(request): model_urls = MajorSiteInfoData.objects.only('location') return {

我有一个包含在多个模板中的动态菜单。(sidebar.html)

但是我在这个应用程序中有大约9个视图,它们都需要这个菜单,我怎样才能重用数据,而不是为每个视图查询9次


谢谢

在应用程序目录中创建一个文件
context\u processors.py
。在那里,创建一个函数,如

def add_sidebar_stuff(request):
    model_urls =  MajorSiteInfoData.objects.only('location')

    return {
        'link_urls': model_urls,
    }
并将其加载到
settings.py

TEMPLATES = [{
    'BACKEND': 'django.template.backends.django.DjangoTemplates',
    ...
    'OPTIONS': {
        'context_processors': [
            ...
            'my_app.context_processors.add_sidebar_stuff',
            ...
以上内容将变量添加到每个模板上下文中。这部分可能是必要的,也可能不是,我不知道您已经在别处加载了变量

然后创建一个部分模板
partial\u menu.html

<ul>
  <li><a href="{% url 'service:showrooms' %}">Showroom</a></li>
{% for link in major_sites %}
  <li><a href="{% url 'service:majorsite' link_urls.id %}">{{ link_urls.location }}</a></li>
{% endfor %}
</ul>

在django中,可以使用上下文处理器的概念。只需编写一个函数,每个请求都会调用该函数。它必须返回您要添加的上下文字典,在您的情况下,该字典类似于:

def menu_context_processor(request):
    return {
        'link': MajorSiteInfoData.objects.only('location')
    }
模板
设置中将此可调用添加到上下文处理程序列表后,现在呈现的每个模板的上下文中将包含
链接
(因此,您可能需要使用不同的名称)


或者,您可以编写自定义模板标记来呈现此菜单

对于这类事情,您通常会使用Django的缓存机制。缓存模板片段或查询结果。
<ul>
  <li><a href="{% url 'service:showrooms' %}">Showroom</a></li>
{% for link in major_sites %}
  <li><a href="{% url 'service:majorsite' link_urls.id %}">{{ link_urls.location }}</a></li>
{% endfor %}
</ul>
<div class="sidebar">
    <h3>Service Menu</h3>
    {% include 'service/partial_menu.html' %}
</div>
def menu_context_processor(request):
    return {
        'link': MajorSiteInfoData.objects.only('location')
    }