Продукты/элементы не добавляются в корзину в Django. Как это исправить?

Я новичок в Django и работаю над приложением для электронной коммерции. Я определил продукты и пользователей. Но я застрял на корзине.

В моем проекте есть два приложения index и cart. Я определил TwoPieceSuit() как модель продуктов в index.models.py и я определил Cart() & CartManager() (просто для правильного управления корзиной, если анонимный пользователь входит в веб, после добавления продуктов в корзину) в cart.models.py.

Я определил two_piece_suits, атрибут в cart.models.Cart как ManyToManyField, ссылающийся на index.models.TwoPieceSuit. Теперь это в основном работает, пока я не хочу сложить price(ы) экземпляров TwoPieceSuit() и сохранить результат в total из Cart(), он не складывает цены. Несмотря на то, что экземпляр Cart() имеет много (из-за ManyToManyField) экземпляров TwoPieceSuit(), содержащих значения в атрибуте price, он не складывает цены, когда я вызываю их для добавления в моем cart.models.py.

Мой index.models.py - это:

Мой cart.models.py - это

from django.conf import settings
from django.db import models
from index.models import TwoPieceSuit

User = settings.AUTH_USER_MODEL

# Create your models here.
class CartManager(models.Manager):
    def new_or_get(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:
            cart_obj = Cart.objects.new(user = request.user)
            new_obj = True
            request.session["cart_id"] = cart_obj.id
        
        return cart_obj, new_obj

    def new(self, user = None):
        user_obj = None
        if user is not None:
            if user.is_authenticated:
                user_obj = user
        return self.model.objects.create(user = user_obj)

class Cart(models.Model):
    user = models.ForeignKey(User, null = True, blank = True, on_delete = models.CASCADE)
    two_piece_suits = models.ManyToManyField(TwoPieceSuit, blank = True)
    total = models.DecimalField(default = 00.00, max_digits = 100, 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)

Мой cart.views.py - это:

from django.shortcuts import render
from .models import Cart, CartManager

# Create your views here.
def cart_home(request):
    cart_obj, new_obj = Cart.objects.new_or_get(request)
    print(cart_obj.two_piece_suits)
    two_piece_suits = cart_obj.two_piece_suits.all()
    total = 0

    for item in two_piece_suits:
        print(item)
        print(item.price)
        total = total + item.price

    cart_obj.total = total
    cart_obj.save()

    return render(request, "cart/home.html", {})

Ниже приведен скриншот, поясняющий, что я добавил экземпляры TwoPieceSuit() в экземпляр Cart(), используя интерфейс администрирования Django: введите описание изображения здесь

Буду очень признателен, если кто-нибудь поможет, так как я уже устал разбираться с этим.

Я решил свою проблему, изучив официальную документацию, приведенную ниже:

Сайт администратора Django | Документация Django | Django

Ссылка на поле модели | Документация Django | Django

Ссылка на связанные объекты | Документация Django | Django

и после небольшого исследования я нашел способ добавить экземпляры TwoPieceSuit в корзину с помощью from django.db.models.signals. Я хотел бы поделиться кодом, чтобы тот, кто читает эту тему, мог найти его полезным

Я не знаю, хороший ли это способ, потому что я сделал это косвенно. Я фактически определил метод pre_save_cart_receiver() и затем подключил его к сигналу m2m_changed, передав модель Cart в качестве отправителя. Теперь, когда я нажимаю на любой экземпляр TwoPieceSuit в таблице Cart в интерфейсе администрирования Django и нажимаю 'Save and Continue Editing', он фактически обновляет атрибут total корзины.

Ниже приведен код для pre_save_cart_receiver():

from django.db.models.signals import m2m_changed

def pre_save_cart_receiver(sender, instance, action, *args, **kwargs):
    if action == "post_add" or action == "post_remove" or action == "post_clear":
        two_piece_suits = instance.two_piece_suits.all()
        total = 0
    
        for item in two_piece_suits:
            total = total + item.price

        instance.total = total
        instance.save()

m2m_changed.connect(pre_save_cart_receiver, sender=Cart.two_piece_suits.through)
Вернуться на верх