You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 23:09:03