0

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

我创建了以下结构:

produtos/        
    templatetags/
        __init__.py
        produto_tags.py   

产品标签.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 文档,但我找不到任何关于可能发生的事情的线索。

谢谢!

4

4 回答 4

3

模板标记文件需要templatetags位于应用程序内部的一个目录中。

于 2012-04-19T16:52:30.787 回答
2

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

于 2012-04-19T17:33:47.760 回答
2

这很棘手,尽管很简单:

首先,项目其他地方的另一个文件夹中有另一个“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
于 2012-04-20T11:26:42.050 回答
-1

改为使用{{ produto | get_all_tags }}

{% ... %}语法仅对块标签有效,例如for.

希望有帮助。

于 2012-04-19T16:45:24.587 回答