如何在 Django 模板中嵌套或联合使用两个模板标签?

Posted

技术标签:

【中文标题】如何在 Django 模板中嵌套或联合使用两个模板标签?【英文标题】:How to nest or jointly use two template tags in Django templates? 【发布时间】:2017-01-18 06:05:15 【问题描述】:

我正在尝试使用模板过滤器来运行一个循环,但我无法在同一个语句/模板中组合两个 python 语句。在模板中组合两个变量的正确方法是什么?请看下面的语法和解释:

我正在建立一个双索引的论坛,这意味着,我有一个 col-md-2 与类别列表。每个类别都有论坛,根据单击的类别,该类别的论坛会填充下一个 col-md-2。剩下的 col-md-8 根据选择的类别和论坛获取其内容。

我的逻辑:

我已经定义了一个加载类别列表的模板标签,无论加载哪个页面或选择哪个类别或论坛,它都不会改变。所以效果很好。但根据所选类别,我的第二列需要填充。为此,我正在尝试定义一个自定义过滤器(如下)。但是,我不确定如何使用它,因为它需要传递给另一个模板,它运行一个循环来呈现 html。即使我在此模板中创建了 for 循环(而不是将其传递给另一个),我仍然需要执行嵌套模板标签,例如:% for forum in forum.category|forumindexlistbycategory % 在任何一种情况下,我都会收到 Invalid filter: 'forumindexlistbycategory' 或 @ 类型的错误987654323@.

我在 pybb_tags.py 中定义了以下自定义模板过滤器:

from pybb.models import Forum

@register.filter
def forumindexlistbycat(category):
    forumlistbycat = Forum.objects.filter(category=category)
    return forumlistbycat

在我的模板中,我尝试按如下方式加载它:

% load i18n pybb_tags %

<div class='category'>
    % if category %
    <h3> category </h3>
    % include 'pybb/forumindex_list.html' with forum_list=category.forums_accessed category=category parent_forum='' %
    % else %
    <h3> forum.category </h3>
    % include 'pybb/forumindex_list.html' with forum_list= % forum.category|forumindexlistbycategory 
    % endif %
</div>

【问题讨论】:

【参考方案1】:

所以你必须先正确注册模板标签。

from django import template
from pybb.models import Forum

register = template.Library()

@register.filter
def forumindexlistbycat(category):
    forumlistbycat = Forum.objects.filter(category=category)
    return forumlistbycat

将上面的代码放在名为您的过滤器的文件中,因此 forumindexlistbycat.py 并将此文件移动到应用程序中的 templatetags 文件夹中。如果您没有此文件夹,则必须创建它。不要忘记在您的模板标签文件夹中添加空文件__init__.py。现在你可以在模板中使用它了,所以:

% load i18n forumindexlistbycat %

当您的模板标签被注册时,您可以通过它的名称加载它。 然后你像这样使用它:

% include 'pybb/forumindex_list.html' with forum_list=forum.category|forumindexlistbycategory %

查看更多信息 - Guide on Custom template tags and filters.

【讨论】:

嗨。包含此自定义过滤器的自定义模板标签文件的名称是 pybb_tags.py,因此我尝试了 % load i18n pybb_tags forumindexlistbycat %% load i18n pybb_tags %% load i18n pybb_tags % % forumindexlistbycat as forumindexlistbycategory % 中的每一个,但每次都出现以下两个错误:Invalid block tag on line 2: 'forumindexlistbycat'. Did you forget to register or load this tag? 或 @987654331 @。我认为您的语法可能是正确的,但是如何正确将此过滤器加载到我的模板中? 尝试将您的标签文件命名为您的过滤器,并将其放在您的应用程序目录中的“templatetags”文件夹中。所以它的路径像'../app/templatetags/forumindexlistbycat.py' 在您的模板标签文件夹中添加空文件__init__.py 如果还是有问题,请尝试重启runserver 嘿,谢谢,它现在可以工作了。如果我在这方面需要更多帮助,我仍然会在这个线程上添加评论,因为我现在正在处理它,但作为感谢,我会将你的答案添加为已接受。 :-)

以上是关于如何在 Django 模板中嵌套或联合使用两个模板标签?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 django 模板中使用嵌套的 forloop 生成表时对 t 行进行编号

使用 For 循环的 Django Python 模板嵌套列表

Django模板访问嵌套数据

Django模板:获取嵌套循环的总迭代次数

Django模板:如何通过每个字典的嵌套属性重新组合字典列表?

Django通用ListView两个型号