Django全站点各页面侧边栏统一展示最新博客文章的实现问题
问题原因
你当前的实现存在几个核心问题导致文章列表不显示:
- 你定义的
LatestBlogEntriesListView是独立视图,仅在访问其绑定的路由时才会生成文章列表上下文,和全局加载的侧边栏没有关联 - 直接
include子模板时没有传递文章列表变量,模板中objects为空,循环无输出 - 排序逻辑不规范:
order_by('created_date')是正序排列,即使拿到数据也是旧文章在前,且用负索引切片在部分数据库场景下会报错 - ListView默认传递的上下文变量是
object_list,你模板中用的objects命名不匹配,即使通过视图访问也取不到数据
解决方案
推荐用Django自定义inclusion标签实现全局复用的侧边栏文章列表,步骤如下:
步骤1:创建自定义模板标签
在blog应用目录下新建templatetags文件夹,文件夹内新增两个文件:
- 空文件
__init__.py,用于标识该目录为Python包 - 标签逻辑文件
blog_extras.py,代码如下:
from django import template from blog.models import Post register = template.Library() @register.inclusion_tag('blog/_latest_blog_entries_list.html') def show_latest_posts(count=3): # 按创建时间倒序取最新的count篇文章 latest_posts = Post.objects.order_by('-created_date')[:count] return {'latest_posts': latest_posts}
步骤2:修改文章列表子模板
更新_latest_blog_entries_list.html,匹配我们传递的上下文变量:
<h4>Latest Blog Entries</h4> {% for post in latest_posts %} <a href="{% url 'blog:post_detail' pk=post.pk %}">{{ post.title }}</a> {% endfor %}
步骤3:修改侧边栏模板调用标签
更新sidebar.html,加载自定义标签后直接调用即可,无需手动include子模板:
{% load blog_extras %} <div class="row"> {% show_latest_posts %} </div>
生效验证
新增标签后重启Django开发服务,所有页面的侧边栏都会正常展示最新3篇博客文章,不受当前访问应用限制。
内容的提问来源于stack exchange,提问作者LJag
相关产品推荐
相关产品推荐

