Django实现动态侧边栏模板并在多页面复用的方案咨询
高效实现Django产品侧边栏全局数据传递的方案
不用在每个视图里重复写查询逻辑,直接用Django的上下文处理器就能搞定,步骤很简单:
- 第一步:在products应用里新建
context_processors.py文件,把你原来sidebar_data视图里获取数据的逻辑搬进来,改成一个函数:
# products/context_processors.py from .models import Product, Category def sidebar_context(request): # 这里写你原来获取侧边栏数据的逻辑,比如: categories = Category.objects.all() hot_products = Product.objects.filter(is_hot=True)[:5] # 返回要注入模板的上下文变量 return { 'sidebar_categories': categories, 'sidebar_hot_products': hot_products, }
- 第二步:在项目的
settings.py里注册这个上下文处理器,找到TEMPLATES配置块,在OPTIONS['context_processors']里添加处理器的路径:
# settings.py TEMPLATES = [ { # 其他配置... 'OPTIONS': { 'context_processors': [ # 保留原来的默认处理器,新增下面这行 'products.context_processors.sidebar_context', ], }, }, ]
- 第三步:修改你的侧边栏模板,直接用返回的变量就行,比如遍历分类:
<!-- 侧边栏模板 --> <div class="sidebar"> <h3>产品分类</h3> <ul> {% for category in sidebar_categories %} <li><a href="/products/category/{{ category.id }}">{{ category.name }}</a></li> {% endfor %} </ul> </div>
这样一来,所有模板(包括你用{% include %}引入的侧边栏)都会自动拿到这些数据,完全不用修改现有视图的代码。如果只想让products应用下的页面才加载这些数据,可以在上下文处理器里加个判断:
def sidebar_context(request): # 只在产品相关页面传递数据 if not request.path.startswith('/products/'): return {} # 正常获取数据逻辑...
内容的提问来源于stack exchange,提问作者Vahid
相关产品推荐
相关产品推荐

