【问题标题】:Problems implementing a Django Custom Template Tag实现 Django 自定义模板标签的问题
【发布时间】:2012-04-19 16:41:53
【问题描述】:

我需要实现一个模板标签,该标签将返回一个字符串,其中包含来自对象的项目集合。

我创建了以下结构:

produtos/        
    templatetags/
        __init__.py
        produto_tags.py   

produto_tags.py:

# -*- coding: utf-8 -*-

from django import template
from django.template import Node
from produto.models import Produto
from django.template.loader import render_to_string

register = template.Library()

@register.tag
def get_all_tags(parser, token):
    args = token.split_contents()
    return ProdutoTemplateNode(args[1])


class ProdutoTemplateNode(Node):
    def __init__(self, produto):
        self.produto = produto

    def render(self, context):
        list = []
        produto = template.Variable(self.produto).resolve(context)
        tags = produto.tags.all()
        if tags:
            for tag in tags:
                list.append(tag.name)
            return ", ".join(list)
        else:
            return u'Não existem tags para este produto'

模板:

{% load produto_tags %}
...
    {% for produto in produtos %}
        <li id="{{ produto.ordenacao }}" data-tags="{% get_all_tags produto %}">
            ...
        </li>
    {% endfor %}
    </ul>
{% else %}
    <p>Não existem produtos cadastrados no sistema</p>
{% endif %} 

我收到此错误:

TemplateSyntaxError at /concrete/nossos-sites.html
Invalid block tag: 'get_all_tags', expected 'empty' or 'endfor'

我读过其他线程,人们说如果标签不存在就会发生此错误,而且似乎是这样。我也一直在查看 djangoproject.com 文档,但找不到任何关于可能发生的事情的线索。

谢谢!

【问题讨论】:

    标签: django python-2.7


    【解决方案1】:

    模板标记文件需要位于您的应用内名为templatetags 的目录中。

    【讨论】:

    • 丹尼尔,我在描述上弄错了。我现在已经更正了描述。
    • templatetags,而不是 template_tags +1
    【解决方案2】:

    首先遵循 Daniel 和 Ignacio 的建议。此外,奇怪的是您在模板顶部有{% load produto_tags %},但出现了无效块错误:如果无法加载produto_tags,则错误应该类似于“produto_tags 不是有效标签”等等。您能否再次检查您发布的代码和路径结构?

    【讨论】:

    • 我刚刚发布了答案。由于来自另一个应用程序的另一个同名模板标签文件而发生冲突。谢谢
    【解决方案3】:

    这很棘手,尽管很简单:

    首先,在项目其他地方的另一个文件夹中还有另一个“produto_tags.py”:

    project/
        common/
            templatetags/
                produtos_tags.py
        produtos/
            templatetags/
                produtos_tags.py
    

    所以,起初我已将所有代码从 produtos/templatetags/ 移至 common/templatetags/。但是当我这样做时,Django 开始抱怨没有从 produtos 中找到 produtos_tags。之后我将代码返回到 produtos/templatetags/ 并将文件重命名为 tags_produtos.py,这有助于显示下面我错误导入的简单部分:

    错误:

    from produto.models import Produto
    

    正确:

    from produtos.models import Produto
    

    【讨论】:

      【解决方案4】:

      请改用{{ produto | get_all_tags }}。

      {% ... %} 语法仅对 for 等块标签有效。

      希望对您有所帮助。

      【讨论】:

      • 过滤器使用@register.filter,而不是@register.tag。
      猜你喜欢
      • 1970-01-01
      • 2012-04-01
      • 2011-05-02
      • 2021-07-13
      • 2015-01-20
      • 2012-03-15
      • 2020-01-24
      • 2015-12-17
      相关资源
      最近更新 更多