我有一个简单的Django站点,其中包含基本模板,然后是特定页面的各种模板。这适用于应用品牌,款式等。
我的网站在概念上类似于JIRA,其中每个视图都需要通过一个名为project的总体变量来通知,用户可以从菜单栏的下拉列表中选择。
菜单栏位于基本模板中。下拉列表将由数据库查询填充(获取登录用户所关联的所有项目)。如何进行查询并将数据发送到基本模板?我宁愿不将相同的查询附加到使用模板的每个视图!
答案 0 :(得分:2)
我决定使用模板标签。这是如何做到的:
templatetags/
文件夹。templatetags
文件夹中,创建一个名为__init__.py
templatetags
文件夹中,为您的代码创建一个文件。我们称之为menu_items.py
这将是一个包含标记,这意味着它还需要一个模板文件。设置如下:
from django import template
from relevant_app import ItemToDisplay
register = template.Library()
@register.inclusion_tag('relevant_app/menu_items.html', takes_context=True)
def menu_items(context):
return {'items': ItemsToDisplay.objects.all()}
在相关模板文件夹中创建menu_items.html
模板文件(在本例中,在relevant_app
项目中,它将是templates\relevant_app
):
{% for item in items %}
<li><a href="{% url items item=item %}">{{ item.item_name }}</a></li>
{% endfor %}
将模板标签添加到主模板:
{% load menu_items %}
{# ... #}
{% menu_items %}
这似乎是Django这样做的方式。标签类型似乎有点繁琐;我努力让他们全部接受上下文,所以我现在只使用inclusion_tag
。
答案 1 :(得分:1)
最近,我一直存储在中间件对象的每个页面上调用的查询,并将响应存储在请求对象中。
例如
# Advanced Queries
from django.db.models import Q # If you need if ( not required )
from django.conf import settings # Application Configuration
class NameThisClass(object):
def process_request(self, request):
"""
Do some processing to get information from the url to load the correct project information.
"""
request.projects = {}
request.projects["menu"] = Menu.objects.filter(params)
然后,您可以在每个模板中访问它,并在不必传递的情况下进行调用 模块视图。
喜欢这样
{{ request.menu }}
注意:如果需要,这就像运行传统的for循环一样。
您必须离开才能从网址获取正确的信息,但是 在某些情况下,这真的很微不足道。
备注:强> 确保settings.py文件中有设置上下文处理器。 除了在settings.py
中添加中间件dict中的中间件位置一切顺利