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

2021-10-17 16:40:33 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个动态菜单,我包括在多个模板。(侧边栏.html)你知道吗

<div class="sidebar">
    <h3>Service Menu</h3>
    <ul>
      <li><a href="{% url 'service:showrooms' %}">Showroom</a></li>
    {% for link in major_sites %}
      <li><a href="{% url 'service:majorsite' link.id %}">{{ link.location }}</a></li>
    {% endfor %}
    </ul>
</div>

在我看来,我会得到如下数据

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

    return render(request, 'service/index.html', {
        'link': model_urls,
    }) 

但是我在这个应用程序中有大约9个视图都需要这个菜单,我怎么能重用数据而不是对每个视图查询9次呢?你知道吗

谢谢

2条回答
网友
1楼 ·

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

def menu_context_processor(request):
    return {
        'link': MajorSiteInfoData.objects.only('location')
    }

TEMPLATES设置中将此可调用添加到上下文处理器列表后,呈现的每个模板现在都将在其上下文中具有link(因此您可能需要使用不同的名称)。django documentation on writing your own context processors。你知道吗

或者,可以编写自定义模板标记来呈现此菜单。django documentation on writing custom template tags

网友
2楼 ·

在应用程序目录中创建文件context_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_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>

如果你想在模板中显示它,include它。你知道吗

<div class="sidebar">
    <h3>Service Menu</h3>
    {% include 'service/partial_menu.html' %}
</div>

相关问题