Django - 如何从中间件修改模板上下文
Django - How to modify template context from middleware
我正在创建一个 Django 中间件来管理 'shopping cart' 会话。我能够像这样成功修改会话数据:
class ShoppingCartMiddleware:
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
# Ensure shopping cart exists
if request.session.get('shopping_cart') is None:
request.session['shopping_cart'] = {'items': []}
return self.get_response(request)
我现在需要修改模板上下文,以便我的模板可以访问有关购物车的特定信息(商品数量等)。我查看了上下文处理器,但是上下文处理器无法查看会话甚至当前上下文。
我试过像这样使用 process_template_response
挂钩:
def process_template_response(self, request, response):
response.context_data['cart_num_items'] = len(request.session['shopping_cart']['items'])
return response
但显然当执行挂钩时,response.context_data
是 None
。
有谁知道如何使用中间件编辑模板上下文?任何帮助将不胜感激。
您不必修改上下文,因为您可以访问 request
对象本身。只需添加一个新属性:
class ShoppingCartMiddleware:
...
def __call__(self, request):
shopping_cart = {'product': 'Blah', 'id': 123}
request.shopping_cart = shopping_cart
...
然后在您的模板中使用它
{{ request.shopping_cart.product }}
我正在创建一个 Django 中间件来管理 'shopping cart' 会话。我能够像这样成功修改会话数据:
class ShoppingCartMiddleware:
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
# Ensure shopping cart exists
if request.session.get('shopping_cart') is None:
request.session['shopping_cart'] = {'items': []}
return self.get_response(request)
我现在需要修改模板上下文,以便我的模板可以访问有关购物车的特定信息(商品数量等)。我查看了上下文处理器,但是上下文处理器无法查看会话甚至当前上下文。
我试过像这样使用 process_template_response
挂钩:
def process_template_response(self, request, response):
response.context_data['cart_num_items'] = len(request.session['shopping_cart']['items'])
return response
但显然当执行挂钩时,response.context_data
是 None
。
有谁知道如何使用中间件编辑模板上下文?任何帮助将不胜感激。
您不必修改上下文,因为您可以访问 request
对象本身。只需添加一个新属性:
class ShoppingCartMiddleware:
...
def __call__(self, request):
shopping_cart = {'product': 'Blah', 'id': 123}
request.shopping_cart = shopping_cart
...
然后在您的模板中使用它
{{ request.shopping_cart.product }}