我在Django中建立了一个博客,并了解了我的模板:博客主页可以使用与单个博客相同的格式显示所有单独的帖子,唯一的区别是文本将被截断为总结
所以我所做的是定义一个模板,用于显示我在主页模板中包含的博客:
{# blog/post_snippet.html #}
{% block content %}
<h1> {{ post.title }} </h1>
{% if post.author %}
<h4>By {{ post.author.short_name }}</h4>
{% endif %}
{% if post.date_published %}
<span>On {{ post.date_published }}</span>
{% endif %}
<p> {{ post.text | safe }} </p>
{% endblock %}
这将在&#34;所有帖子&#34;中的for循环中使用。页:
{% block content %}
{% for post in posts %}
{% include 'blog/post_snippet.html' %}
{% endfor %}
{% endblock %}
现在的问题是,当显示所有帖子时,如何告诉模板系统截断博客文本?一种解决方案是复制模板代码,但我不想这样做。我还想过继承,但我的模板已经从基础模板继承了,而且我认为继承会立即插入所有内容,所以我不能控制块放置?
实际上,我很困惑。这里的最佳做法是什么?答案 0 :(得分:2)
基本思想是通过传递参数来包含post_snippet.html,以告知您是否需要截断的文本版本。
首先,向模型添加一个属性,该属性将返回文本的截断版本,例如:
@property
def truncated_text():
if len(self.text) > 100:
return '%s...' % self.text[0:100]
else:
return self.text
在post_snippet.html中,将{{ post.text | safe }}
替换为:
{% if truncated %}{{ post.truncated_text | safe }}{% else %}{{ post.text | safe }}{% endif %}
在主页中,您只需要以这种方式包含post_snippet.html:
{% include 'blog/post_snippet.html' with truncated=True %}