如何使用Django框架在导航栏中展示数据库存储的分类列表

解决方案
你把导航栏放在base.html全站引入的场景下,自定义上下文处理器是最优实现方案,不需要在每个业务视图重复查询、传递分类数据,一次配置后全站所有模板都能直接访问分类列表。
步骤1:编写上下文处理器
在存放分类模型的app(示例中为post应用)下新建context_processors.py文件,写入以下代码:
from .models import Category # 替换成你自己的分类模型实际导入路径 def global_categories(request): # 可根据业务需求加筛选条件,比如只展示启用状态的分类:Category.objects.filter(is_active=True) return {"categories": Category.objects.all()}
步骤2:注册处理器到Django配置
打开项目的settings.py文件,找到TEMPLATES配置段,在OPTIONS下的context_processors列表末尾追加你刚写的处理器路径:
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", # 追加下面这行,替换成你实际的app名和函数名 "post.context_processors.global_categories", ], }, }, ]
步骤3:修改导航栏模板渲染动态分类
打开includes/navbar.html,把分类下拉菜单里写死的测试菜单项替换成模板循环,直接读取注入的categories变量即可:
<ul aria-labelledby="navbarDropdown" class="dropdown-menu"> {% for category in categories %} <li><a class="dropdown-item" href="#">{{ category.name }}</a></li> {% empty %} <li><span class="dropdown-item text-muted">暂无可用分类</span></li> {% endfor %} </ul>
其他可选方案(仅适合非全站场景)
如果导航栏只在少数个别页面使用,不需要全站加载,你也可以在include引入局部模板时直接传参:
{% include "includes/navbar.html" with categories=category_list %}
但你当前是把导航放在base.html全站复用,这种方案需要每个视图都单独查询分类数据再传给模板,会产生大量重复代码,不推荐使用。
内容的提问来源于stack exchange,提问作者Pouria sh
相关产品推荐
相关产品推荐

