Utilice Django para crear sesiones y botones para conectar productos al carrito de la compra a través de plantillas y vistas. Py

Descripción simplificada del problema

siento haber tardado tanto (creo que la información es relevante) y gracias por ayudar a entender cómo funciona esto. Estoy tratando de a ñadir un artículo a un carrito de la compra usando las plantillas de sesiones y Django. También soy nuevo en aprender Django, y he leído un montón de documentos similares y problemas de desbordamiento de pila. Mis datos se guardan en la base de Datos Mysql (que puede cambiar) de la siguiente manera:
sql_entry = {
        'model': 'App.Product',
        'pk': 1, # unique for each item
        'fields': {
                    'Name': 'name',
                    'Price': 1.0,
                    'Quantity': 1
        }
Y mi modelo:
    class Product(models.Model):
    Name = models.CharField(max_length=200, default='')
    Price = models.FloatField()
    Quantity = models.IntegerField()


    def __str__(self):
        return self.Name

    class Meta:
        ordering = ['Name']
Debido a que los productos reales cambian todos los días, me gustaría evitar las categorías de código duro y pensar que es mejor tener sólo datos relacionados con los productos disponibles. Por lo tanto, utilizo la plantilla de django para crear una vista de tabla básica para cada producto y a ñadirla al carrito de la compra usando un botón. Ahora quiero evitar cualquier tipo de conexión. He aprendido que las sesiones son la mejor manera de que un cliente único a ñada un artículo al carrito de la compra y guarde los datos en mi base de datos. Creo que mi botón Añadir al carrito de la compra necesita guardar temporalmente sus entradas en mi base de datos, de alguna manera correspondiente a su ID de sesión, y ahí es donde me metí en muchos problemas. En el siguiente bloque de código, intento a ñadir un elemento al carrito de la compra de la sesión que debe ser único para cada navegador. Cuando hago clic en el botón, se redirige al carrito de la compra, pero no pasa nada. Si pudieras mostrarme lo mal que estaba configurada mi configuración, sería genial. Aquí están las vistas, plantillas de carrito de la compra y patrones de URL:

Sessions settings in views.py

    def index(request):
    response = render_to_response('buylist/Home.html')
    visits = int(request.COOKIES.get('visits', '0'))
    if 'last_visit' in request.COOKIES:
        last_visit = request.COOKIES['last_visit']
        last_visit_time = datetime.strptime(last_visit[:-7], "%Y-%m-%d %H:%M:%S")
        if (datetime.now() - last_visit_time).days > 0:
            response.set_cookie('visits', visits + 1)
            response.set_cookie('last_visit', datetime.now())
    else:
        response.set_cookie('last_visit', datetime.now())
    return response

add to cart function in views.py

# add Product to cart after button click
def add_to_cart(request, product_id):
    cart = request.session.get('cart', {})
    product = Product.objects.get(id=product_id)
    cart[product_id] = product
    request.session['cart'] = cart
    return HttpResponseRedirect(reverse("cart"))


# Cart View
def get_cart(request):
    cart = request.session.get('cart',{})
    return render(request, 'buylist/cart.html', cart)
Aquí están mis plantillas y patrones de URL:

basic.html #Product product page that has button

{% for item in file %}
    <tbody>
      <tr>
        <td>{{item.fields.Name}}</td>
        <td>${{item.fields.Price}}</td>
        <td>{{item.fields.Quantity}}</td>
        <td>
            <a href="http://127.0.0.1:8000/cart/{{item.id}}"><button>Add</button></a>      
        </td>

      </tr>
    </tbody>
{% endfor %}

Url Patterns in App.urls

    path('cart/<int:product_id>/', views.add_to_cart, name='add'),
    path('cart/', views.get_cart, name='cart'),

cart.html

<table>
    <tr>
        <center><h2>Shopping Cart</h2></center>
        <th>Product|</th>
        <th>Quantity|</th>
        <th>Total Price</th>
    </tr>

    {% for item in cart %}
    <tr>
        <td>{{item}}</td>
    </tr>
    {% endfor %}
</table>

La respuesta más útil para mí

para actualizar su carrito, haga lo siguiente. Elimina los productos añadidos y añade productos que no existen en el carrito de la compra. Ambas funciones están disponibles. El ID del producto proviene del último formulario html dado. Este es el producto que desea añadir al carrito de la compra.
def cart_update(request):
    p = request.POST.get("product_id")
    if p is not None:
        product_obj = Product.objects.get(id =p)
        c,n = Cart.objects.get_or_new(request)
        if product_obj not in c.products.all():
            c.products.add(product_obj)

    else:
        c.products.remove(product_obj)
        print("to be added")

    return redirect("cart:home")
El modelo de carrito de la compra es
class Cart(models.Model):
    user = models.ForeignKey(User, null = True, blank = True)
    products = models.ManyToManyField(Product, blank= True)

    subtotal = models.DecimalField(default = 0.00, max_digits= 12, decimal_places=2)

    total = models.DecimalField(default = 0.00, max_digits= 12, decimal_places=2)
    updated = models.DateTimeField(auto_now =True)
    timestamp = models.DateTimeField(auto_now_add  = True)
    objects  = CartManager()

    def __str__(self):
        return str(self.id)

class CartManager(models.Manager):
    def get_or_new(self,request):
        cart_id = request.session.get('cart_id', None)
        qs = self.get_queryset().filter(id = cart_id)
        if qs.count() ==1:
            new_obj = False
            cart_obj = qs.first()
            if request.user.is_authenticated() and cart_obj.user is None:
                cart_obj.user = request.user
                cart_obj.save()
       else:
            new_obj = True
            cart_obj = Cart.objects.new_cart(user = request.user)
            request.session['cart_id'] = cart_obj.id
       return cart_obj, new_obj
Su formulario HTML
<h1>Your Cart</h1>

{% for a in cart.products.all %}
<form action="{% url "cart:update" %}" method="POST">{% csrf_token %}

<input type="hidden" name="product_id" value='{{a.id}}' placeholder="
 {{a.id}}"/>

<h4>Your Product: <a href= '{{ a.get_absolute_url}}'>{{a.title}}</a><small>
<br><button type="submit">Remove?</button></small></h4>
<p>Price :

{{a.price}}</p>
</form>
{% endfor %}

<b>Subtotal: {{cart.subtotal}}</b><br>
Total: {Cart. Total}
<a href="{% url "cart:checkout" %}"> Checkout</a>
Eso es lo que vas a hacer. Lea el Código para entenderlo completamente. Es un poco complicado. Si el usuario es nuevo, utilizo el Administrador para crear un nuevo objeto carrito de la compra. Un modelo de producto es un modelo en el que se pueden a ñadir muchos productos diferentes.