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

Rob*_*ant 1 django django-templates django-views

我有一个简单的 Django 网站,其中包含一个基本模板,然后是特定页面的各种模板。这非常适合应用品牌、风格等。

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

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

Rob*_*ant 5

我决定使用模板标签。操作方法如下:

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

    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()}
    
    Run Code Online (Sandbox Code Playgroud)
  5. 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 %}
    
    Run Code Online (Sandbox Code Playgroud)
  6. 将模板标签添加到主模板中:

    {% load menu_items %}
    {# ... #}
    {% menu_items %}
    
    Run Code Online (Sandbox Code Playgroud)

这似乎是 Django 的方式来做到这一点。标签类型看起来有点繁琐;我很难让他们全部接受上下文,所以我inclusion_tag现在只使用。