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

时间:2018-08-01 04:27:38

标签: django middleware

我正在创建一个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

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

1 个答案:

答案 0 :(得分:3)

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

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

然后在模板中使用它

{{ request.shopping_cart.product }}