如果我创建了模板标签:
@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 y in'的格式:for last_books'Floys'3中的x
答案 0 :(得分:7)
就个人而言,我只是通过视图将该书作为上下文变量传入。这样你就不需要模板标签了。
或者,您可以使用inclus_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 %}
未经测试,但我希望这表明了这个想法。如上所述,如果您不想在多个地方重复使用,可以通过上下文或使用inclusion_tag将书籍直接传递给视图。
答案 1 :(得分:2)
为什么不with?