4

テンプレートタグを作成した場合:

@register.simple_tag
def last_books(a_cat, cutoff=5):
    objects = Books.objects.filter(category=a_cat)
    return objects[:cutoff]

テンプレートで次のようなことを行うにはどうすればよいですか。

{% for book in last_books 'Sports' 3 %}

現在、次のエラーが発生しています。

'for' ステートメントは 'for x in y' の形式を使用する必要があります: for x in last_books 'Sports' 3

4

2 に答える 2

9

個人的には、ビューを介して本をコンテキスト変数として渡すだけです。そうすれば、テンプレート タグは必要ありません。

別の方法として、inclusion_tag デコレーターを代わりに使用することもできます。これは、現在のドキュメントにカスタム コンテキストを持つインクルード テンプレートをレンダリングするというアイデアをまとめたものです。

しかし、現在のパスを続行したい場合は、simple_tagデコレータは適していません。stringテンプレートに直接レンダリングしたいを返す必要がある場合に使用します。あなたがやろうとしているのは、テンプレート コンテキスト変数を設定することです。これは少し複雑ですが、それほど難しくありません。次のようなノードを作成します。

class LastBooksNode(template.Node):
    def __init__(self, category, cutoff=5, var_name='books'):
        self.category = category
        self.cutoff = cutoff
        self.var_name = var_name
    def render(self, context):
        context[self.var_name] = Books.objects.filter(category=self.category)[:self.cutoff]
        return ''

@register.tag(name='last_books')
def do_last_books(parser, token):
    error = False
    try:
        tag_name, category, cutoff, _as, var_name = token.split_contents()
        if _as != 'as':
            error = True
    except:
        error = True

    if error:
        raise TemplateSyntaxError, 'last_books must be of the form, "last_books <category> <cutoff> as <var_name>"'
    else:
        return LastBooksNode(a_cat, cutoff, var_name)

次に、テンプレート タグを次のように呼び出します。

{% import <your tag library> %}
{% last_books 'category' 5 as my_books %}
{% for book in my_books %}
    ....
{% endfor %}

テストされていませんが、これがアイデアを示していることを願っています。ただし、前述のように、複数の場所でこれを再利用するつもりがない場合は、コンテキストを介してブックをビューに直接渡すか、includes_tag を使用する方が簡単な場合があります。

于 2009-03-16T17:21:58.290 に答える
3

なぜではないですか?

于 2009-03-16T15:49:45.813 に答える