[Python][Django] Webapp met winkelwagen

Pagina: 1
Acties:

Vraag


Acties:
  • 0 Henk 'm!

  • Kefding
  • Registratie: Augustus 2009
  • Laatst online: 03-10 13:22
Hallo Tweakers!

Sinds enige tijd ben ik weer aan het programmeren en heb ik me verdiept in Python & Django.
Hiermee wilde ik een hobbyprojectje maken, namelijk een soort kleine webshop. Het moet in de toekomst gaan functioneren als 'streepsysteem' bij een studievereniging.

Het doel is dus een online app, waar een product aangeklikt kan worden, waarna deze gepakt kan worden. De transactie moet bijgehouden worden in de database, waarna er na een bepaalde tijd geincasseerd wordt.

Om meerdere producten toe te kunnen voegen aan een transactie is het de bedoeling dat er een soort winkelwagen ontstaat.
Hoe kan dit het beste gerealiseerd worden? Is het het makkelijkst om met sessies te werken of moet er direct weggeschreven worden naar de database?

Zelf was ik aan het proberen de sessies werkend te krijgen, maar dit wil nog niet helemaal lukken.

[ Voor 6% gewijzigd door Kefding op 23-04-2017 20:18 ]

Last.FM | Trakt.TV

Alle reacties


Acties:
  • 0 Henk 'm!

  • ValHallASW
  • Registratie: Februari 2003
  • Niet online
Mijn eerste reactie is: e-commerce is niet triviaal, en probeer dus niet het wiel opnieuw uit te vinden -- gebruik een van de standaard-plugins voor Django.

Echter, als het je om het leren van webdevelopment gaat, dan het volgende: Je hebt in ieder geval een sessie nodig om state tussen verschillende requests bij te houden, maar er zijn verschillende manieren om de winkelwagen bij te houden. De (m.i.) meest elegante manier om dat te doen is een winkelwagen-tabel in je database. Die link je (met een 1-op-1 of 1-op-N relatie) aan de gebruiker. Op basis van de gebruiker (waarvan de informatie in de sessie staat) kan je dan vervolgens ook de winkelwagen benaderen.

Andere opties zijn:
- wel een winkelwagentabel, maar het ID bijhouden in de sessie ipv de user-tabel
- überhaupt geen winkelwagentabel, maar het bijhouden van de hele winkelwagen in je sessie

Het grote nadeel van deze opties is dat de winkelwagen van een gebruiker leeg raakt als 'ie opnieuw inlogt.

Waar vervolgens de sessie wordt opgeslagen is nog een tweede vraag - dat kan als bestand, maar ook de sessies kunnen in de database worden opgeslagen. Zie daarvoor de documentatie @ https://docs.djangoproject.com/en/1.11/topics/http/sessions/

Acties:
  • 0 Henk 'm!

  • Ed Vertijsment
  • Registratie: Juli 2014
  • Laatst online: 23:03
Ten eerste: Ja, e-commerce opnieuw uitvinden in s niet nodig en complex. Je moet dit alleen willen om van te leren (en zelfs dan wellicht niet eens echt te gaan gebruiken), goede kans dat er al een (betere) oplossing voor is.

Als je gaat proggen om te leren:

Afhankelijk van hoe je systeem eventueel uiteindelijk gaat draaien lijkt mij sessies hier niet de beste oplossing. Het lijkt mij dat je gewoon gebruiker X aan "streepje?" (ken geen streepjessysteem) wilt koppelen en daar de informatie over op wilt slaan om vervolgens hier een factuur van te maken. Ik zou dan vooral naar Django's ORM kijken.

Check allereerst even de Django tutorial (https://docs.djangoproject.com/en/1.11/intro/tutorial01/) en probeer daarna te bedenken (aan de hand van de kennis daaruit) hoe je jouw use case zo goed mogelijk kan inrichten.

Acties:
  • 0 Henk 'm!

  • McKaamos
  • Registratie: Maart 2002
  • Niet online

McKaamos

Master of the Edit-button

Streepsysteem? Volgens mij wil je meer een POS maken, niet?
Zo'n handig touchscreen waarop aangetikt kan worden dat je X biertjes en een zak chips wil.
En dat wordt dan weggeschreven zodat je 'op rekening' kan drinken/eten.

http://www.softwareadvice...-pos-software-comparison/

Iemand een Tina2 in de aanbieding?


Acties:
  • 0 Henk 'm!

  • Kefding
  • Registratie: Augustus 2009
  • Laatst online: 03-10 13:22
Ik heb een bestaande oplossing gevonden, maar deze bevatte nog niet alle functies die ik zelf wilde, dus daar ben ik nu nog mee bezig.
Het huidige probleem is dat ik een totaalprijs voor de winkelwagen wil berekenen.

models.py
Python:
1
2
3
4
5
6
7
8
9
10
11
12
class Cart(models.Model):
    creation_date = models.DateTimeField(verbose_name=_('creation date'))
    checked_out = models.BooleanField(default=False, verbose_name=_('checked out'))

class Item(models.Model):
    cart = models.ForeignKey(Cart, verbose_name=_('cart'))
    quantity = models.PositiveIntegerField(verbose_name=_('quantity'))
    unit_price = models.DecimalField(max_digits=18, decimal_places=2, verbose_name=_('unit price'))

    def total_price(self):
        return self.quantity * self.unit_price
    total_price = property(total_price)


Momenteel is er dus een total_price per item, die opgeroepen kan worden in een template.
Ik wilde echter ook een total_price per cart, maar omdat de total_price van het item aangemaakt word door een model kan ik deze niet aanroepen bij het cart model

Ik heb momenteel dit als knutselcode
Python:
1
2
3
4
5
    def cart_total(self):
        current_item_quantity = Item.objects.filter(cart=22).values('quantity')
        current_item_unit_price = Item.objects.filter(cart=22).values('unit_price')
        return XX
    cart_total = property(cart_total)


Nu krijg ik dus 2 querysets, vb:
Queryset quantity {2;6}
Queryset unit_price {0,34;1,54}

Is het mogelijk deze te vermenigvuldigen? Of zijn er veel eenvoudigere manieren om dit voor elkaar te krijgen?

Last.FM | Trakt.TV


Acties:
  • 0 Henk 'm!

Verwijderd

Je zou misschien kunnen kijken naar een opstelling waar je dus 'item', 'cart', en 'cart_items' in je model hebt. 'cart_items' is dan een inline van 'cart'
Hierdoor krijg je onder 'cart' een of meerdere 'cart_items' en je vervolgens weer het totaal per 'cart' kunt berekenen. (relationeel heeft 'cart_item' dan en FK naar de PK van 'cart')
'item' gebruik je dan alleen om je aanbod van items te normaliseren; 1 item voor bier, 1 voor chips, 1 voor cola. Deze link je dan via een FK in 'cart_item' aan de PK van 'item'
Pagina: 1