我正在使用Django中的一个简单的博客应用程序,我无法弄清楚如何动态生成侧栏中的五个最新帖子。我的每个视图都是基于类的,它们扩展了一个通用模板,每个视图映射到一个模板,我认为这是正确的方法。我已经找到了使用模板标签的方法,但似乎Django不喜欢你在模板中放置任何逻辑。
我认为这个问题是我希望它存在于我的base.html中,因为我希望最近的帖子在网站范围内显示,是一个甚至应该映射到你的base.html的视图,或者是否会导致问题,我很擅长这个。我不知道如何处理这个问题,我是否应该为base.html创建一个新视图,或者我是否应该使用我的模板标签,或者我是否应该扩展现有视图(但如果我这样做它会赢得'在网站范围内?)。
我基本上想要以下内容(它们按逆时间顺序排列)
{% for post in post_list[:4] %}
<a href="{{ post.get_absolute_url }}"> {{ post.title }} </a>
{% endfor %}
答案 0 :(得分:2)
您可以使用模板标记。更具体地说,inclusion tag就是您所需要的。这允许您通过类似于视图的小块在模板内的任何位置插入渲染的片段。
例如,创建一个templatetags/blog_tags.py
文件(在您的应用中创建templatetags
文件夹非常重要; Django默认在此处搜索)blog
应用并添加以下内容:
from django import template
register = template.Library()
@register.inclusion_tag('blog/snippets/recent_posts.html')
def render_recent_blogposts():
return {
# This is just an example query, your actual models may vary
'post_list': BlogPost.objects.all().order_by("published_on")[:4]
}
现在创建一个blog/snippets/recent_posts.html
模板(只要它匹配上面的@register.inclusion_tag(...)
,它就可以在任何地方。):
<ul>
{% for post in post_list %}
<li><a href="{{ post.get_absolute_url }}"> {{ post.title }}</a></li>
...
{% endfor %}
</ul>
最后,在原始模板中,您现在可以呈现模板标记:
<aside>
{% load blog_tags %}
{% render_recent_blogposts %}
</aside>