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

就个人而言,我只是通过视图将书作为上下文变量传递。这样你就不需要模板标签了。

或者,您可以改用 contains_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 %}

未经测试,但我希望这能证明这个想法。但是,如上所述,如果您不打算在多个地方重用它,那么通过上下文直接将书籍传递给视图或使用包含标签可能会更容易。

于 2009-03-16T17:21:58.290 回答
3

为什么不

于 2009-03-16T15:49:45.813 回答