自定义标签未加载到模板中
Posted
技术标签:
【中文标题】自定义标签未加载到模板中【英文标题】:Custom tag not loaded in template 【发布时间】:2016-05-05 09:36:21 【问题描述】:我创建了一个我想使用的自定义标签,但 Django 似乎找不到它。我的templatetags
目录是这样设置的:
pygmentize.py
from pygments import highlight
from pygments.lexers import get_lexer_by_name
from django import template
from pygments.formatters.other import NullFormatter
register = template.Library()
@register.tag(name='code')
def do_code(parser,token):
code = token.split_contents()[-1]
nodelist = parser.parse(('endcode',))
parser.delete_first_token()
return CodeNode(code,nodelist)
class CodeNode(template.Node):
def __init__(self,lang,code):
self.lang = lang
self.nodelist = code
def render(self,context):
code = self.nodelist.render(context)
lexer = get_lexer_by_name('python')
return highlight(code,lexer,NullFormatter())
我正在尝试使用此标记来呈现gameprofile.html
中的代码。
gameprofile.html
(% load pygmentize %
% block content %
<title>% block title % | game.title % endblock %</title>
<div id="gamecodecontainer">
% code %
game.code
% endcode %
</div>
% endblock content %
当我导航到 gameprofile.html
时,我收到一个错误:
第 23 行的块标记无效:'code',预期为 'endblock'。您是否忘记注册或加载此标签?
【问题讨论】:
% do_code %% endcode %
有效吗? (是不是忽略了名字)
我试过了,do_code
也不行。
嗯,对我来说,唯一看起来不合适的是你在一个块内有一个块......不确定这是否会影响事情(标题) . (我可能是错的,我不认为我使用任何嵌套块)
标题已经有一段时间了,没有问题。虽然% code %
部分的块内也有一个块......
是的,我再次明确地指的是block
标签,但我想有时你只希望一个块显示另一个块是否存在......我真的看不出来您的代码有任何问题,当然我认为您已经重新启动了runserver
命令
【参考方案1】:
错误在这一行:(% load pygmentize %
,一个无效的标签。
改成% load pygmentize %
【讨论】:
呃,这些是同一个字符串。 ? 没有一个以括号开头,一个以括号开头 仅供参考...我遇到了类似的问题,但间距不正确。我有 % load static % ,但它必须是 % load static %【参考方案2】:对于 Django 2.2 到 3,您必须先在 html 模板中加载 staticfiles,然后才能使用 static 关键字
% load staticfiles %
<link rel="stylesheet" href="% static 'css/bootstrap.min.css' %">
对于其他版本,请使用 static
% load static %
<link rel="stylesheet" href="% static 'css/bootstrap.min.css' %">
您还必须检查您是否在 setting.py
中定义了 STATIC_URL最后,确保静态文件存在于定义的文件夹中
【讨论】:
对于 Django 3.0 这会导致错误:django.template.exceptions.TemplateSyntaxError: 'staticfiles' is not a registered tag library。所以看起来“加载静态”至少对于 Django 3.0+ 来说是正确的命令 对于 Django 3 仅使用% load static %
【参考方案3】:
你试过了吗
% load games_tags %
在顶部而不是 pygmentize?
【讨论】:
为什么? Pygmentize 被 game_tags 取代了?没有带有 game_tags 名称的文件 原帖中没有“game_tags”。这个答案没有帮助。【参考方案4】:% load static %
<img src="% static "my_app/example.jpg" %" >
在您的模板中,使用静态模板标签使用配置的STATICFILES_STORAGE
为给定的相对路径构建 URL。
【讨论】:
【参考方案5】:% load static %
请将此模板标签添加到 HTML 或基础 HTML 文件的顶部
【讨论】:
【参考方案6】:遇到了同样的问题,但我刚刚从我的扩展模板中添加了 % load static %
并且它有效。因此,在您的情况下,如果您尝试从基本模板加载 gameprofile.html
,您只需要像这样添加它:
% extends 'some_base.html' %
% block content %
% load pygmentize %
【讨论】:
【参考方案7】:我遇到了同样的问题,我是这样解决的。在this very excellent Django tutorial的第一部分之后,我做了以下事情:
-
通过执行以下命令创建一个新的 Django 应用程序:
python manage.py startapp new_app
编辑settings.py
文件,将以下内容添加到INSTALLED_APPS
列表中:'new_app',
向名为new_app_tags
的new_app
包添加一个新模块。
在 Django HTML 模板中,将以下内容添加到文件顶部,但在 % extends 'base_template_name.html' %
之后:% load new_app_tags %
在new_app_tags
模块文件中,创建自定义模板标签(见下文)。
在同一个 Django HTML 模板中,从上面的第 4 步开始,使用您的新自定义标签,如下所示:% multiply_by_two | "5.0" %
庆祝!
上述第 5 步的示例:
from django import template
register = template.Library()
@register.simple_tag
def multiply_by_two(value):
return float(value) * 2.0
【讨论】:
【参考方案8】:包含自定义标签的应用必须在INSTALLED_APPS
中。那么您确定您的目录在INSTALLED_APPS
中吗?
来自documentation:
包含自定义标签的应用程序必须位于
INSTALLED_APPS
中,% load %
标签才能正常工作。这是一项安全功能:它允许您在单个主机上托管多个模板库的 Python 代码,而无需为每个 Django 安装启用对所有模板库的访问。
【讨论】:
games
应用程序包含在已安装的应用程序中。
包含自定义标签的应用程序,这里是模板标签
我收到ImportError: No module named templatetags
这是错误的,操作存储模板标签的位置没有任何问题,并且它们没有被归类为应用程序
这里唯一的应用程序是 games
并且必须包含在内,否则操作员尝试在其中呈现其标签的实际模板将不可用。【参考方案9】:
在gameprofile.html
中,请将标签% endblock content %
更改为% endblock %
,否则django不会加载endblock并报错。
【讨论】:
【参考方案10】:你需要改变:
% endblock content %
到
% endblock %
【讨论】:
以上是关于自定义标签未加载到模板中的主要内容,如果未能解决你的问题,请参考以下文章
在Django中自定义模板标签以过滤博客中的featured_posts
我的 Joomla 模板正在使用 JS 加载我的自定义 CSS。有没有办法将唯一版本标签添加到我的自定义 CSS 中?即:custom.css?20180101