【问题标题】: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 命令

标签: django django-templates pygments


【解决方案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" %}" alt="My image">

在您的模板中,使用静态模板标签使用配置的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的第一部分之后,我做了以下事情:

        1. 通过执行以下命令创建一个新的 Django 应用程序:python manage.py startapp new_app
        2. 编辑settings.py 文件,将以下内容添加到INSTALLED_APPS 列表中:'new_app',
        3. 向名为new_app_tags 的new_app 包添加一个新模块。
        4. 在 Django HTML 模板中,将以下内容添加到文件顶部,但在 {% extends 'base_template_name.html' %} 之后:{% load new_app_tags %}
        5. 在new_app_tags 模块文件中,创建自定义模板标签(见下文)。
        6. 在同一个 Django HTML 模板中,从上面的第 4 步开始,使用您的新自定义标签,如下所示:{% multiply_by_two | "5.0" %}
        7. 庆祝!

        上述第 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 %}
            

            【讨论】:

              猜你喜欢
              • 2017-07-29
              • 2019-12-30
              • 2016-02-25
              • 2013-01-29
              • 2010-11-15
              • 2011-07-10
              • 1970-01-01
              • 2015-01-20
              • 1970-01-01
              相关资源
              最近更新 更多