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

Django首页视图无法识别object_list,动态导航栏仅在平台页生效如何解决?

问题原因

object_list是Django ListView类视图仅针对对应页面模板自动注入的上下文变量:

  • 你访问PlatformList对应的平台页时,模板能拿到object_list变量,导航栏正常展示
  • 首页、游戏列表/详情页的视图没有主动传入平台查询结果,模板找不到object_list,导航栏自然为空

同时你当前写的类视图中自定义的context类属性是无效的,Django类视图不会自动读取该属性作为模板上下文,必须通过get_context_data方法注入自定义变量。


解决方案

方案1:手动给所有视图补充上下文(适合页面较少的场景)

  1. 修改首页函数视图:
def home(request):
    platforms = Platform.objects.all()
    return render(request, 'blog/home.html', {'object_list': platforms})
  1. 改造所有类视图,重写get_context_data方法注入导航栏需要的平台数据:
class GameList(ListView):
    template_name = "blog/game.html"
    model = Game

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['object_list'] = Platform.objects.all()
        context['games'] = Game.objects.all()
        return context

class GameDetail(DetailView):
    template_name = "blog/game_detail.html"
    model = Game
    slug_url_kwarg = 'slug' # 无需自定义get_object方法,直接配置该参数即可匹配路由中的slug字段

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['object_list'] = Platform.objects.all()
        return context

方案2:使用全局上下文处理器(更适合公共导航栏场景,推荐)

导航栏属于全站公共组件,用上下文处理器一次配置后所有页面模板都能自动拿到平台变量,无需逐个修改视图:

  1. 在你的blog应用下新建context_processors.py文件,写入:
from .models import Platform

def get_platforms(request):
    return {
        # 所有模板都可以直接使用platform_list变量
        'platform_list': Platform.objects.all()
    }
  1. 打开项目根目录的settings.py,找到TEMPLATES配置项,新增你写的上下文处理器:
TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
                # 新增你的上下文处理器
                'blog.context_processors.get_platforms',
            ],
        },
    },
]
  1. 最后修改导航栏的遍历代码,统一使用platform_list变量,避免和ListView默认的object_list混淆,可读性更高:
{% for platform in platform_list %}
    <li><a href="#">{{platform.title}}</a></li>
{% endfor %}

内容的提问来源于stack exchange,提问作者saleh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 09:39:03