Как зделать корзину для не залогинених пользователей?

Чтобы создать корзину для не залогиненных пользователей в Django, можно использовать сессии. Сессии в Django позволяют хранить информацию о пользователях на сервере, идентифицируемого с помощью уникального сессионного ключа, который затем отправляется клиенту в виде cookie. В случае не залогиненного пользователя, этот уникальный ключ будет использоваться для связывания данных корзины с конкретным пользователем.

Вот несколько шагов, которые нужно выполнить:

1. Включите поддержку сессий в настройках вашего проекта (файл settings.py):

# settings.py
INSTALLED_APPS = [
    ...
    'django.contrib.sessions',
    ...
]

MIDDLEWARE = [
    ...
    'django.contrib.sessions.middleware.SessionMiddleware',
    ...
]

2. Создайте представление для добавления товаров в корзину:

# views.py
from django.shortcuts import render, redirect

def add_to_cart(request, product_id):
    product = Product.objects.get(id=product_id)
    
    # Создание или получение существующей сессии
    if 'cart' not in request.session:
        request.session['cart'] = {}
    
    cart = request.session['cart']
    
    # Добавление товара в корзину
    if product_id not in cart:
        cart[product_id] = {
            'quantity': 1,
            'price': str(product.price),
        }
    else:
        cart[product_id]['quantity'] += 1
    
    request.session['cart'] = cart
    
    return redirect('cart')

3. Создайте представление для отображения корзины:

# views.py
def cart(request):
    cart = request.session.get('cart', {})
    total_price = 0
    
    for product_id, cart_item in cart.items():
        product = Product.objects.get(id=product_id)
        cart_item['product'] = product
        cart_item['total_price'] = cart_item['quantity'] * Decimal(cart_item['price'])
        total_price += cart_item['total_price']
    
    return render(request, 'cart.html', {'cart': cart, 'total_price': total_price})

4. Создайте шаблон для отображения корзины:

<!-- cart.html -->
{% for product_id, cart_item in cart.items %}
    <div>
        <h3>{{ cart_item.product.name }}</h3>
        <p>Quantity: {{ cart_item.quantity }}</p>
        <p>Price: {{ cart_item.price }}</p>
        <p>Total Price: {{ cart_item.total_price }}</p>
    </div>
{% endfor %}

<p>Total price: {{ total_price }}</p>

5. Добавьте URL-маршруты:

# urls.py
from django.urls import path
from . import views

urlpatterns = [
    ...
    path('add_to_cart/<int:product_id>/', views.add_to_cart, name='add_to_cart'),
    path('cart/', views.cart, name='cart'),
    ...
]

Теперь, когда вы добавите товар в корзину, его информация будет храниться в сессии, и вы сможете отображать содержимое корзины на странице с помощью представления cart().