因此,想象一下,如果我有这样注册为包含标签的小部件:
my_cons = [3,5,6,7,8,10]
end = len(my_cons)
curr = 0
longest_seq = 0
longests = []
while curr < end:
tmp_curr = curr;
while tmp_curr < end-1:
if my_cons[tmp_curr] +1 == my_cons[tmp_curr+1]:
tmp_curr += 1
else:
break
if tmp_curr - curr > longest_seq:
longest_seq = tmp_curr - curr
longests = [my_cons[curr:tmp_curr+1]]
elif tmp_curr - curr == longest_seq:
longests.append(my_cons[curr:tmp_curr+1])
curr = tmp_curr + 1
print (longests)
在小部件模板中,我遍历了Foo对象中的某些条目。我在Mega菜单和页脚中包含了小部件。这些模板显然是分开的。并包含在@register.inclusion_tag('tags/widget.html', takes_context=True)
def widget(context):
return {'qs': Foo.objects.all(),
'request': context['request'],}
但是现在,当我加载主页时,我两次针对相同的小部件(“菜单”和“页脚”)访问了数据库,因此我得到了重复的查询。我该如何防止这种情况?
我喜欢包含标记的想法,但我不想重复查询。
答案 0 :(得分:1)
您可以在base.html
中调用标签并保存其返回的数据,然后将其传递给可能需要该数据的其他子模板。
但是我认为您无法再使用inclusion_tag
。您可能需要使用类似simple_tag
的名称。这是一个示例:
简单标签:
@register.simple_tag
def widget(some_data):
return Foo.objects.all()
基本模板:
# You can access the result as foo_objs
{% widget some_data as foo_objs %}
# pass the data to other templates:
{% include "menu.html" with foo_objs=foo_objs %}
{% include "footer.html" with foo_objs=foo_objs %}
现在调用一次小部件函数,就可以传递数据了。