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

如何在Django中实现全站可用的分类下拉列表

实现全站可访问的分类下拉菜单

方案一:使用Django上下文处理器(推荐)

上下文处理器可让指定数据在所有模板中自动生效,适合全站通用的数据场景。

1. 创建上下文处理器

在你的app目录下新建context_processors.py文件,写入以下代码:

from .models import Category

def categories_processor(request):
    return {
        'all_categories': Category.objects.all()
    }

2. 在settings中注册处理器

打开项目根目录的settings.py,找到TEMPLATES配置,在OPTIONS['context_processors']中添加处理器路径:

TEMPLATES = [
    {
        # 保留原有其他配置
        'OPTIONS': {
            'context_processors': [
                # 保留原有处理器
                '你的app名称.context_processors.categories_processor',
            ],
        },
    },
]

注意替换你的app名称为实际的应用名称

3. 调整模板并全局引用

完善media/categories_dropdown.html的下拉结构:

<select name="category" id="category-select">
    <option value="">选择分类</option>
    {% for category in all_categories %}
        <option value="{{ category.slug }}">{{ category.name }}</option>
    {% endfor %}
</select>

在全站基础模板(如base.html)的合适位置(比如导航栏),通过模板包含引入下拉菜单:

{% include 'media/categories_dropdown.html' %}

所有继承base.html的页面都会自动加载该下拉菜单。


方案二:使用自定义模板标签

若不需要数据全局生效,可通过模板标签按需加载分类数据。

1. 创建模板标签文件

在app目录下新建templatetags文件夹,内部创建__init__.py和category_tags.py:

# your_app/templatetags/category_tags.py
from django import template
from ..models import Category

register = template.Library()

@register.simple_tag
def get_all_categories():
    return Category.objects.all()

2. 在模板中调用标签

在需要下拉菜单的模板(如base.html)中,先加载标签库再使用:

{% load category_tags %}

<select name="category" id="category-select">
    <option value="">选择分类</option>
    {% for category in get_all_categories %}
        <option value="{{ category.slug }}">{{ category.name }}</option>
    {% endfor %}
</select>

清理冗余代码

完成上述配置后,原有的CategoryListView类视图和对应的URL路由可删除,无需再通过单独页面提供分类数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 01:57:26