如何将通用视图代码放在Django基本模板中

时间:2014-07-24 14:32:10

标签: django django-templates django-views

我有一个简单的Django站点,其中包含基本模板,然后是特定页面的各种模板。这适用于应用品牌,款式等。

我的网站在概念上类似于JIRA,其中每个视图都需要通过一个名为project的总体变量来通知,用户可以从菜单栏的下拉列表中选择。

菜单栏位于基本模板中。下拉列表将由数据库查询填充(获取登录用户所关联的所有项目)。如何进行查询并将数据发送到基本模板?我宁愿不将相同的查询附加到使用模板的每个视图!

2 个答案:

答案 0 :(得分:2)

我决定使用模板标签。这是如何做到的:

  1. 在相关的应用程序文件夹下,创建一个templatetags/文件夹。
  2. templatetags文件夹中,创建一个名为__init__.py
  3. 的空文件
  4. templatetags文件夹中,为您的代码创建一个文件。我们称之为menu_items.py
  5. 这将是一个包含标记,这意味着它还需要一个模板文件。设置如下:

    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()}
    
  6. 在相关模板文件夹中创建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 %}
    
  7. 将模板标签添加到主模板:

    {% load menu_items %}
    {# ... #}
    {% menu_items %}
    
  8. 这似乎是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中的中间件位置

一切顺利