Django 3.x如何让context变量被多个视图访问 如何定义公共常量
Django 3.x多视图共享context变量、公共常量实现方案
实现方案(按适用场景选择)
场景1:变量需要全局所有模板/视图使用 → 上下文处理器
适合需要在全站点所有页面使用的公共数据/常量,Django原生支持该能力:
- 在对应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, # 公共查询结果 }
- 在项目
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中定义常量,有两种规范实现:
- 仅当前
views.py内的视图使用:直接在文件顶部定义即可
# views.py 顶部定义 POST_DEFAULT_STATUS = "published" MAX_POST_COUNT = 20 # 后续所有视图都可以直接调用上述常量
- 需要跨多个文件使用:单独在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
相关产品推荐
相关产品推荐

