Jak napisać koszyk do przechowywania produktów?

0

Witam serdeczne. Otóż tworze właśnie sklep. Próbuje właśnie napisać koszyk i średnio mi to idzie. Koszyk chcialem stworzyc w oparciu o pliki cookies żeby można było korzystać z koszyka bez logowania. Prosze bardzo o pomoc kogos bardziej doswiadczonego, aby mnie nakierował jak go stworzyć.

Mój kod w chwili obecnej jest zrobiony w analogicznym oparciu o kod który znalazłem w internecie. Jeżeli jest ktos kto poswieciłby mi chwilke to bylbym bardzo wdzieczny

models.py:

class Koszyk(models.Model):
    klient = models.CharField(max_length=1000, blank=False)
    ilosc_produktow = models.IntegerField(default=0)
    suma_cena_brutto = models.IntegerField(default=0)
    suma_cena_netto = models.IntegerField(default=0)
    stworzono = models.DateTimeField(auto_now_add=True)
    def __init__(self, request):
        self.session = request.session
        cart = self.session.get(koszyk)
        if not cart:
            cart = self.session[koszyk] = {}
        self.cart = cart
    def add(self, element, quantity):
        element_koszyk_id = str(element.numer)
        if element_koszyk_id not in self.cart:
            self.cart[element_koszyk_id] = {'quantity': 0, 'price': str(element.cena_brutto)}
        self.cart[element_koszyk_id]['quantity'] += quantity
        self.save()


    def save(self):
        self.session.modified = True

class ElementKoszyk(models.Model):
    koszyk = models.ForeignKey(Koszyk, default=None, on_delete=models.CASCADE, related_name="elementKoszyk")
    numer = models.PositiveIntegerField()
    nazwa = models.CharField(max_length=1000, blank=False)
    cena_brutto = models.IntegerField(default=0)
    cena_netto = models.IntegerField(default=0)

views.py:

def koszyk(request, page=0):
    page = 'koszyk'
    cart = Koszyk(request)
    # View code here...
    t = loader.get_template('ext/koszyk.html')
    c = locals()

    return HttpResponse(t.render(c, request))


from django.shortcuts import get_object_or_404
# add to cart
def koszyk_dodaj(request, product_id):
    cart = Koszyk(request)
    produkt = get_object_or_404(Produkt, id=product_id)
    # form = KoszykFormDodawanie(request.POST)
    # if form.is_valid():
    #     cd = form.cleaned_data
    #     cart.add(product=produkt, quantity=cd['quantity'])
    return redirect('cart:details')
0

Jaki jest błąd w tym kodzie, debugowales?

0

No właśnie nie debugowałem, bo jeszcze nigdy nie debugowalem kodu. Jak mozna debugowac? masz jakis tutorial ?

0

Nie wiem z jakiego edytora korzystasz.
Ale pierwszy wynik z google:
https://code.visualstudio.com/docs/python/debugging

0

z pycharma community tego darmowego. Wygooglalem sobie w internecie. Mam odpalic debugger zatem i sprawdzic gdzie jest blad, tak ?

0

To by było najbardziej produktywne, tak. Jak już go namierzysz, ale będziesz miał problemy ze zrozumieniem, z czego wynika czy jak mu zaradzić, to jak nam pokażesz wszystkie potrzebne szczegóły, to spróbujemy Cię naprowadzić.

0

Ja bym zrobił to tak (Dawno nie pisałem w django, więc nie nie wiem czy zadziała :D)

class Cart:
    price = models.DecimalField()
    finalized = models.BooleanField(default=False)
    
    class Meta:
        abstract = True
    
    def save(self, **args, **kwargs):
        if not self.price:
            self.price = self.final_price
        return super().save(self, **args, **kwargs)
    
    @property
    def final_price(self):
        return sum(item.price for item in self.items)

class CartAuthorized(Cart):
    user = models.ForeginKey(users, on_delete=models.CASCADE)

class CartNotAuthorized(Cart):
    ...

class CartItem:
    item = models.ForeginKey(Item, on_delete=models.CASCADE)
    cart = models.ForeignKey(Cart, on_delete=models.CASCADE, related_name="items")
    amount = models.IntegerField()
    
    @property
    def price(self):
        return self.item.price * self.amount

class Item:
    name = models.TextField()
    amount = models.IntegerField()
    price = models.DecimalField()
    

Tworzenie mapy na sesji jak i cała je modyfikacja powinna zachodzić na poziomie widoku (view). W powyższym masz 2 tabele - koszyk dla zarejestrowanych i niezarejestrowanych. W zależności od potrzeby tworzysz odpowiedni koszyk.

0

Dziękuje Ledi. Zrobiłem tak jak Ty podałeś. Poprawiłem tylko kilka błędów.

Poza tym dostałem też błąd:

ERRORS:
monkeyShop.CartItem.cart: (fields.E300) Field defines a relation with model 'Cart', which is either not installed, or is abstract.
monkeyShop.CartItem.cart: (fields.E307) The field monkeyShop.CartItem.cart was declared with a lazy reference to 'monkeyShop.cart', but app 'monkeyShop' doesn't provide model 'cart'.

Musiałem zakomentować to, ze model Cart jest abstrakcyjny żeby ruszyło. Wpłynie to jakoś na całokształt?

W ogóle zastanawiam sie teraz jak napisać widok pod te klasy co mi wysłałeś. Myślałem, żeby ustawiać ciasteczko za każdym razem gdy ktoś doda przedmiot do koszyka i wtedy tworzyc obiekt Cart,a id ciasteczka równym sumie wszystkich obiektów. Tylko, ze tych obiektów z czasem stworzy mi sie tysiące i to może powoli działać. Nie wiem może Ty masz jakiś lepszy pomysł jakby to ugryźć. Hmmm?

0

Dostaje error 'RelatedManager' object is not iterable jak próbuje wykonać funkcje self.final_price przypisana do klasy:

class Cart(models.Model):
    price = models.DecimalField(decimal_places=100, max_digits=100, default=0)
    finalized = models.BooleanField(default=False)

    # class Meta:
    #     abstract = True


    def save(self, **args):
    # def save(self, **args, **kwargs):
        if not self.price:
            self.price = self.final_price
        return super().save(self, **args)
        # return super().save(self, **args, **kwargs)
    @property
    def final_price(self):
        return sum(item.price for item in self.items)

class CartItem(models.Model):
    produkt = models.ForeignKey(Produkt, on_delete=models.CASCADE)
    cart = models.ForeignKey(Cart, on_delete=models.CASCADE, related_name="items")
    amount = models.IntegerField()

    @property
    def price(self):
        return self.produkt.cena * self.amount

1 użytkowników online, w tym zalogowanych: 0, gości: 1