如何在 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 模板嵌套列表