2009-10-09 15 views
1

Je suis novice en python et j'ai décidé de faire un essai avec TG2 en développant un petit magasin. Jusqu'ici je l'ai aimé, mais je devine que mon paradigme de codage est toujours très attaché à Like par exemple de java, la méthode add to cart dans mon CartController.Gestion des éléments du panier en python Turbogears 2.0

def add(self, **kw): 
    pid=kw['pid'] 

    product = model.Product.by_id(pid) 

    cart = self.get_cart() 

    # check if that product is already on the cart 
    isInCart = False 
    for item in cart.items: 
     if item.product == product: 
      # if it is, increment quantity 
      cart.items.remove(item) 
      isInCart = True 
      item.quantity += 1 
      cart.items.append(item) 
      break 

    if not isInCart: 
     item = model.CartItem(cart, product, 1, product.normalPrice) 
     cart.items.append(item) 

    DBSession.add(item) 
    DBSession.flush() 

    # updating values for fast retrieval showing 
    # how many items are in the cart 
    self.update_session(cart) 

    return u'Item added to cart, %d items in session' % session['cartitems'] 

C'est certainement pas la meilleure façon d'y parvenir, mais jusqu'à présent, il fonctionne comme prévu. En Java je voudrais juste mettre à jour l'objet Item, mais ici je dois le retirer de la liste puis mis à jour, puis ajouté à nouveau, est-ce correct?

Répondre

3

Puisque vous modifiez l'objet item, je ne vois aucune raison pour laquelle vous devriez supprimer, puis ajouter cet élément à la liste. Pourquoi pensez-vous que vous devez?

En ce qui concerne ce qui en fait plus pythonique, vous pourriez envisager quelque chose comme ceci:

items_by_pid = dict([(item.product.pid, item) for item in cart.items]) 
item = items_by_pid.get(pid, None) 
if item is None: 
    item = model.CartItem(cart, product, 0, product.normalPrice) 
    cart.items.append(item) 
item.quantity += 1 
+0

Si je ne suis pas la quantité d'article est pas mis à jour, comme le DBSession ne marque pas comme un objet sale, il n'a jamais enregistre sa nouvelle quantité Ma première tentative a été sans le retirer de la liste. – Juparave

+0

oublier que, mauvais rafraîchissement, il est mis à jour, merci. Suppression de cette partie du code. – Juparave

+0

Je fais des suppositions quant à la configuration de votre modèle; comme supposer que '1' était la quantité initiale, et que puisque vous récupérez le produit par pid, il a un membre pid (vous pouvez utiliser 'id' ou quelque chose, mais la même idée). Vous voudrez peut-être intégrer «récupérer l'article du panier» comme une méthode du panier lui-même, et lui faire retourner l'article avec la quantité de 0 si elle n'existe pas ... mais vous aurez une meilleure idée de cela depuis c'est votre code. – retracile