在Django模板中渲染外部定义的块

1 投票
3 回答
1131 浏览
提问于 2025-04-16 06:53

我正在为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

你在找一种叫做包含标签的东西。

撰写回答