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

如何将通用视图代码放入Django基模板中,django,django-templates,django-views,Django,Django Templates,Django Views,我有一个简单的Django站点,它有一个基本模板,然后是针对特定页面的各种模板。这对于应用品牌、样式等非常有效 我的站点在概念上类似于JIRA,每个视图都需要一个名为project的总体变量来通知,用户可以从菜单栏的下拉列表中选择该变量 菜单栏位于基础模板中。下拉列表将由数据库查询填充(获取登录用户关联的所有项目)。如何进行查询并将数据发送到基本模板?我不希望将相同的查询附加到使用该模板的每个视图 最近,我一直在中间件对象中存储每个页面上调用的查询,并将响应存储在请求对象中 比如说 # Adva

我有一个简单的Django站点,它有一个基本模板,然后是针对特定页面的各种模板。这对于应用品牌、样式等非常有效

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


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

最近,我一直在中间件对象中存储每个页面上调用的查询,并将响应存储在请求对象中

比如说

# 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循环一样

您将不得不通过查找来从URL获取正确的信息,但是 在某些情况下,这确实微不足道

注意事项: 确保settings.py文件中有安装上下文处理器。 以及在settings.py中的中间件dict中添加中间件位置


最近,我一直在中间件对象中存储每个页面上调用的查询,并将响应存储在请求对象中

比如说

# 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循环一样

您将不得不通过查找来从URL获取正确的信息,但是 在某些情况下,这确实微不足道

注意事项: 确保settings.py文件中有安装上下文处理器。 以及在settings.py中的中间件dict中添加中间件位置


最好的

我决定使用模板标签。以下是如何做到这一点:

  • 在相关应用程序文件夹下,创建一个
    templatetags/
    文件夹
  • templatetags
    文件夹中,创建一个名为
    \uuuuu init\uuuuuuuuuu.py的空文件
  • templatetags
    文件夹中,为标记创建一个文件。我们称之为
    菜单项.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()}
    
  • 在相关模板文件夹中创建
    菜单项.html
    模板文件(在这种情况下,在
    相关应用程序
    项目中,它将是
    模板\相关应用程序
    ):


  • 这似乎是Django的方法。但是标记类型似乎有点复杂;我努力让他们都接受上下文,所以我现在只使用
    inclusion\u标记。

    我决定使用模板标记。以下是如何做到这一点:

  • 在相关应用程序文件夹下,创建一个
    templatetags/
    文件夹
  • templatetags
    文件夹中,创建一个名为
    \uuuuu init\uuuuuuuuuu.py的空文件
  • templatetags
    文件夹中,为标记创建一个文件。我们称之为
    菜单项.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()}
    
  • 在相关模板文件夹中创建
    菜单项.html
    模板文件(在这种情况下,在
    相关应用程序
    项目中,它将是
    模板\相关应用程序
    ):


  • 这似乎是Django的方法。但是标记类型似乎有点复杂;我努力让他们都接受上下文,所以我现在只使用
    inclusion\u标记

    例如,这是模板标记的作业吗?例如,这是模板标记的作业吗?