Django-如何从中间件修改模板上下文



我正在创建一个Django中间件,用于管理带有会话的"购物车"。我能够成功地修改会话数据,如下所示:

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_dataNone

有人知道如何使用中间件编辑模板上下文吗?如有任何帮助,我们将不胜感激。

您不必修改上下文,因为您可以访问request对象本身。只需添加一个新属性:

class ShoppingCartMiddleware:
...
def __call__(self, request):
shopping_cart = {'product': 'Blah', 'id': 123}
request.shopping_cart = shopping_cart
...

然后在你的模板中使用它

{{ request.shopping_cart.product }}

最新更新