Django - Bộ xử lý ngữ cảnh hiển thị trên tất cả các templates

Lấy ví dụ về việc hiển thị menu django-mptt, thông thường bạn sẽ phải thêm chế độ xem cho menu trong từng templates, điều đó khiến code lặp đi lặp lại nhiều lần, ví dụ hiển thị danh mục trong product-list:

def product_list(request):
    ...
    category = Category.objects.all()
    ...
    return render(request, 'product_list.html', {'category': category})

Bạn sẽ phải lặp lại category = Category.objects.all() trong cất cả các templates mà bạn muốn hiển thị menu.
Để giải quyết vấn đề này, ta sẽ viết bộ sử lý ngữ cảnh hoạt động trên tất cả các templates mà không cần viết chế độ xem cho từng templates.

Xem thêm: Django mptt - Danh mục cha hiển thị tất cả sản phầm của danh mục con

Giả sử bạn có một ứng dụng được đặt tên là shop, làm theo các bước dưới đây:

  • Thêm shop vào INSTALLED_APPS trong tệp settings.py (có lẽ bạn đã làm rồi khi tạo app);
  • Tạo một context_processors.py vào thư mục shop;
  • Thêm mã sau vào tệp context_processors.py:
# shop/context_processors.py
from .models import Category

def Category_processor(request):
   category = Category.objects.all()
   return {'category': category}

Thêm context_processors.py vào TEMPLATES trong settings.py như sau:

TEMPLATES = [
    {
        ...
        'OPTIONS': {
            'context_processors': [
                ...
                'shop.context_processors.Category_processor',  # new
            ],
        },
    },
]

Bạn có thể làm tương tự cho bộ xử lý ngữ cảnh khác bằng cách thêm mã tương ứng vào context_processors.pyTEMPLATES.