在Django模板中渲染外部定义的块
我正在为Django写一个简单的博客应用,想要实现一个首页,显示最多5篇文章,同时还有一个完整的归档页面,能一次列出大约100篇文章。(100篇只是个数字,实际情况可能没那么多)
因为这两个页面上的博客文章块看起来几乎一模一样,只是显示的数量不同,所以我想把对应的HTML放在一个单独的模板里,这样可以在实际渲染的模板中引用或链接到它。我查阅了文档,发现include
标签看起来很有希望,但它似乎是在当前上下文之外渲染的,这对我来说没什么帮助,因为这样就无法获取要循环的对象。除此之外,我找不到其他方法来实现我想要的功能。这可能吗?还是我只能放弃,违背DRY原则呢?下面是我的代码,给你个大概念。
谢谢
#######################
# news/frontpage.html #
#######################
{% extends "news/base.html" %}
{% block site_title %} - Front Page{% endblock %}
{% block center_col %}
{{ block.super }}
<a href="/news/">View Older Blog Posts</a>
{% endblock %}
{% block blog_rows %}
{% for object in object_list %}
# Blog post content would go here, however it is to be included.
{% endfor %}
{% endblock %}
3 个回答
0
你为什么不直接筛选出你想在页面上显示的博客文章呢?这样的话,你就可以保持模板不变:
{% for object in blogposts %}
# ...
{% endfor %}
你在页面中定义博客文章,这样可以选择显示5篇或者100篇文章。
0
Ignacio说得对,你确实需要一个包含标签,但你要知道,include
标签不会在当前上下文之外渲染——它肯定是使用它所在的代码块的相同上下文。
你的问题可能是因为你试图在object_list
上调用blogpost_set
——但这个关系并不是和对象列表相关,而是和列表中的每一个单独对象相关。你需要遍历object_list
,然后在每一个对象上调用blogpost_set.all
。
2
你在找一种叫做包含标签的东西。