自定义标签未加载到模板中

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_tagsnew_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 中自定义模板标签以过滤博客中的特色帖子

在Django中自定义模板标签以过滤博客中的featured_posts

自定义 SVG 未加载到我的图像标签中

Jinja - 加载自定义模板标签集

如何在颤动中自定义标签栏宽度?

我的 Joomla 模板正在使用 JS 加载我的自定义 CSS。有没有办法将唯一版本标签添加到我的自定义 CSS 中?即:custom.css?20180101