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

Django 3.x如何让context变量被多个视图访问 如何定义公共常量

Django 3.x多视图共享context变量、公共常量实现方案

实现方案(按适用场景选择)

场景1:变量需要全局所有模板/视图使用 → 上下文处理器

适合需要在全站点所有页面使用的公共数据/常量,Django原生支持该能力:

  1. 在对应app目录下新建context_processors.py文件,编写公共逻辑:
from .models import Post

def common_post_context(request):
    # 此处编写公共数据查询、常量定义逻辑
    latest_posts = Post.objects.filter(status="published").order_by("-publish_time")[:5]
    return {
        "MAX_DISPLAY_COUNT": 5, # 公共常量
        "latest_posts": latest_posts, # 公共查询结果
    }
  1. 在项目settings.py的TEMPLATES配置项中注册该处理器:
TEMPLATES = [
    {
        # 其他原有配置保持不变
        "OPTIONS": {
            "context_processors": [
                # 原有系统默认的上下文处理器保留,新增下面一行
                "你的app名.context_processors.common_post_context",
            ]
        }
    }
]

配置完成后,所有模板都可以直接调用{{ latest_posts }}、{{ MAX_DISPLAY_COUNT }},不需要每个视图单独传值。


场景2:仅少量视图(如你提到的index和post_list两个页面)使用 → 公共函数/类混合器

该方案不会全局加载,性能开销更低:

如果你使用函数视图(FBV)

直接在views.py中封装公共逻辑函数,各个视图调用即可:

from .models import Post

# 封装公共逻辑
def get_common_post_data():
    return {
        "POST_PAGE_SIZE": 10, # 公共常量
        "public_posts": Post.objects.filter(status="published").order_by("-publish_time")[:10]
    }

def index(request):
    context = get_common_post_data()
    # 补充首页独有的数据
    context["banner"] = "首页公告"
    return render(request, "index.html", context)

def post_list(request):
    context = get_common_post_data()
    # 补充列表页独有的数据
    context["page_title"] = "文章列表"
    return render(request, "post_list.html", context)

如果你使用类视图(CBV)

编写公共Mixin类,需要用到公共数据的视图继承该类即可:

from django.views.generic import ListView
from .models import Post

# 公共混合类
class CommonPostMixin:
    # 常量直接定义为类属性即可
    POST_PAGE_SIZE = 10

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context["public_posts"] = Post.objects.filter(status="published").order_by("-publish_time")[:10]
        return context

# 首页视图继承
class IndexView(CommonPostMixin, ListView):
    model = Post
    template_name = "index.html"
    # 其他独有的类配置

# 列表页视图继承
class PostListView(CommonPostMixin, ListView):
    model = Post
    template_name = "post_list.html"
    paginate_by = CommonPostMixin.POST_PAGE_SIZE # 直接调用公共常量

关于views.py定义常量

完全可以直接在views.py中定义常量,有两种规范实现:

  1. 仅当前views.py内的视图使用:直接在文件顶部定义即可
# views.py 顶部定义
POST_DEFAULT_STATUS = "published"
MAX_POST_COUNT = 20

# 后续所有视图都可以直接调用上述常量
  1. 需要跨多个文件使用:单独在app目录下新建constants.py文件存储常量,需要时导入即可:
# constants.py
POST_DEFAULT_STATUS = "published"
MAX_POST_COUNT = 20

# views.py 中导入使用
from .constants import POST_DEFAULT_STATUS, MAX_POST_COUNT

旧方案说明

不推荐将业务相关的变量写入settings.py,settings.py仅用于存储框架级配置,混入业务变量会大幅提升后期维护成本。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.12 13:09:03