Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Django - How to modify template context from middleware

I am creating a Django middleware that manages a 'shopping cart' with sessions. I was able to successfully modify the session data like so:

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)

I now need to modify the template context so that my templates can have access to certain information about the shopping cart (number of items, etc). I looked at context processors, but context processors are not able to view the session or even the current context.

I tried using the process_template_response hook like so:

def process_template_response(self, request, response):
    response.context_data['cart_num_items'] = len(request.session['shopping_cart']['items'])
    return response

but apparently when the hook is executed, response.context_data is None.

Does anyone know how to edit the template context with middleware? Any help would be appreciated.

like image 461
Grayson Pike Avatar asked Jan 27 '23 16:01

Grayson Pike


1 Answers

You don't have to modify the context as you have access to the request object itself. Just add a new attribute:

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

then use it in your template

{{ request.shopping_cart.product }}
like image 130
Selcuk Avatar answered Feb 12 '23 17:02

Selcuk