Настройка корзины в контексте запроса
Создадим обработчик контекста для установки текущей корзины в контекст запроса для шаблонов. Мы сможем получить доступ к этой корзине в любом шаблоне.
Создайте новый файл в каталоге приложения cart и назовите его context_processors.py. Контекстные процессоры могут размещаться в любом месте кода, но создание их в отдельном документе поможет вам лучше организовать структуру проекта. Добавьте в файл следующий код:
from .cart import Cart
def cart(request):
return {'cart': Cart(request)}
Как видно, контекстный процессор — это функция, которая получает объект запроса в качестве параметра и возвращает словарь объектов, которые будут доступны всем шаблонам, визуализированным с помощью RequestContext. В нашем обработчике контекста мы создаем объект корзины с помощью объекта request и делаем его доступным для шаблонов в виде переменной с именем cart.
Отредактируйте файл Settings.py проекта и добавьте 'cart.context_processors.cart' для параметра context_processors в парамертах TEMPLATES. После изменения этот параметр будет выглядеть следующим образом:
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, 'templates')]
,
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
'cart.context_processors.cart',
],
},
},
]
Теперь контекстный процессор будет выполняться при каждом просмотре шаблона с использованием RequestContext Джанго. Переменная cart будет задана в контексте для шаблонов.
Контекстные процессоры выполняются во всех запросах, использующих RequestContext.. Если вы собираетесь получить доступ к базе данных, может понадобиться создать пользовательский тег шаблона вместо контекстного процессора.
Теперь отредактируйте шаблон shop/base.html приложения shop и найдите:
<div class="cart">
Your cart is empty.
</div>
Замените предыдущие строки следующим кодом:
<div class="cart">
{% with total_items=cart|length %}
{% if cart|length > 0 %}
Your cart:
<a href="{% url "cart:cart_detail" %}">
{{ total_items }} item{{ total_items|pluralize }},
${{ cart.get_total_price }}
</a>
{% else %}
Your cart is empty.
{% endif %}
{% endwith %}
</div>
Запкстите сервер с помощью команды python manage.py runserver
. Откройте в браузере http://127.0.0.1:8000/ и добавьте в корзину несколько товаров. Теперь в заголовке сайта можно будет увидеть общее количество товаров в корзине и их общую стоимось: