我有一个包含在多个模板中的动态菜单。 (sidebar.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次?
由于
答案 0 :(得分: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>
答案 1 :(得分:0)
在django中,您可以使用上下文处理器的概念。只需编写一个函数,将在每个请求中调用。它必须返回您要添加的上下文字典,在您的情况下将类似于:
def menu_context_processor(request):
return {
'link': MajorSiteInfoData.objects.only('location')
}
将此callable添加到TEMPLATES
设置中的上下文处理器列表后,呈现的每个模板现在都在其上下文中有link
(因此您可能希望使用不同的名称)。 django documentation on writing your own context processors
或者,您可以编写自定义模板标记来呈现此菜单。 django documentation on writing custom template tags