Django Генерирование cookie перед загрузкой страницы

Я создаю сайт электронной коммерции и генерирую cookie устройства для хранения UUID неавторизованных пользователей. Если пользователь не авторизован, он ищет его cookie и отображает количество товаров в корзине для данного устройства (в navbar.html). Когда я запускаю любую страницу, я получаю KeyError: 'device', поскольку она пытается вызвать функцию, которая ищет cookie, которая еще не существует. Есть ли какой-нибудь обходной путь?

base.html

<html lang="en">
  <head>
    <script>

      function getCookie(name) {
            var cookieValue = null;
            if (document.cookie && document.cookie !== '') {
                var cookies = document.cookie.split(';');
                for (var i = 0; i < cookies.length; i++) {
                    var cookie = cookies[i].trim();
                    // Does this cookie string begin with the name we want?
                    if (cookie.substring(0, name.length + 1) === (name + '=')) {
                        cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
                        break;
                    }
                }
            }
            return cookieValue;
          }

      let device = getCookie('device');

      function uuidv4() {
        return ([1e7]+-1e3+-4e3+-8e3+-1e11).replace(/[018]/g, c =>
          (c ^ crypto.getRandomValues(new Uint8Array(1))[0] & 15 >> c / 4).toString(16)
        );
      }

      if (device == null || device == undefined) {
        device = uuidv4();
      }
      
      document.cookie = 'device=' + device + ';domain=;path=/'
    </script>
  </head>
  {% include "navbar.html" %}
</html>

navbar.html

<span class="badge red z-depth-1 mr-1"> {{ request|cart_item_count }} </span>

cart_tag.py

from django import template
from store.models import Order, Customer
register = template.Library()

@register.filter
def cart_item_count(request):
    try:
        customer = request.user.customer
    except AttributeError:
        device = request.COOKIES['device']
        customer, _ = Customer.objects.get_or_create(device=device)
    qs = Order.objects.filter(customer=customer, ordered=False)
    if qs.exists():
        return qs[0].items.count()
    return 0

РЕДАКТ: views.py

from django.views.generic import ListView
from .models import ShopItem
class HomeView(ListView):
    model = ShopItem
    paginate_by = 4
    template_name = "home-page.html"

models.py

from django.db import models
class ShopItem(models.Model):
    id = models.AutoField(primary_key=True)
    title = models.CharField(max_length=100)
    description = models.TextField()

Думаю, вам следует изменить ваш код следующим образом, возможно, в cart_tag.py для начального None device cookie

from django import template
from store.models import Order, Customer

register = template.Library()


@register.filter
def cart_item_count(request):
    customer = None
    try:
        customer = request.user.customer
    except AttributeError:
        device = request.COOKIES.get('device', '')
        if device:
            customer, _ = Customer.objects.get_or_create(device=device)
    if customer:
        qs = Order.objects.filter(customer=customer, ordered=False)
        if qs.exists():
            return qs[0].items.count()
    return 0
Вернуться на верх