0

オブジェクトからアイテムのコレクションを含む文字列を返すテンプレート タグを実装する必要があります。

次の構造を作成しました。

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 のドキュメントも調べましたが、何が起こっているのかについての手がかりを見つけることができませんでした。

ありがとう!

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 に答える