Django首页视图无法识别object_list,动态导航栏仅在平台页生效如何解决?
问题原因
object_list是Django ListView类视图仅针对对应页面模板自动注入的上下文变量:
- 你访问PlatformList对应的平台页时,模板能拿到
object_list变量,导航栏正常展示 - 首页、游戏列表/详情页的视图没有主动传入平台查询结果,模板找不到
object_list,导航栏自然为空
同时你当前写的类视图中自定义的context类属性是无效的,Django类视图不会自动读取该属性作为模板上下文,必须通过get_context_data方法注入自定义变量。
解决方案
方案1:手动给所有视图补充上下文(适合页面较少的场景)
- 修改首页函数视图:
def home(request): platforms = Platform.objects.all() return render(request, 'blog/home.html', {'object_list': platforms})
- 改造所有类视图,重写
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:使用全局上下文处理器(更适合公共导航栏场景,推荐)
导航栏属于全站公共组件,用上下文处理器一次配置后所有页面模板都能自动拿到平台变量,无需逐个修改视图:
- 在你的
blog应用下新建context_processors.py文件,写入:
from .models import Platform def get_platforms(request): return { # 所有模板都可以直接使用platform_list变量 'platform_list': Platform.objects.all() }
- 打开项目根目录的
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', ], }, }, ]
- 最后修改导航栏的遍历代码,统一使用
platform_list变量,避免和ListView默认的object_list混淆,可读性更高:
{% for platform in platform_list %} <li><a href="#">{{platform.title}}</a></li> {% endfor %}
内容的提问来源于stack exchange,提问作者saleh
相关产品推荐
相关产品推荐

