مطمعناً یکی از مهمترین قسمت های یک سایت فروشگاهی طراحی قسمت سبد خرید آن است.
برای ایجاد سبد خرید در جنگو روش های متفاوتی وجود دارد.
در این آموزش میخواهیم با استفاده از مدل های جنگو سبد خرید خودمون را طراحی کنیم.
برا مدل محصولات خودمون از مدل زیر استفاده میکنیم :
class Product(models.Model): title = models.CharField(max_length=150) description = models.TextField() price = models.PositiveBigIntegerField() image = models.ImageField() def __str__(self): return self.title
حالا نیاز به یه مدل دیگه به اسم سبد خرید داریم تا هر کاربر بتونه یک سری از محصولات مورد نیازش را به اون اضافه کنه و عملیات پرداخت را انجام بده :
class Cart(models.Model): user = models.ForeignKey(User, on_delete=models.CASCADE) is_paid = models.BooleanField(default=False) @property def total_price(self): total = 0 for cart_item in self.cartitems.all(): total += (cart_item.price * cart_item.quantity) return int(total) def __str__(self): return self.user.username
حتما براتون الان سوال شده که چرا بین مدل محصولات و سبد خرید هیچ رابطه ای برقرار نیست؟
برای وصل کردن سبد خرید به محصولات نیاز به یک مدل دیگه ای به شکل زیر داریم:
class CartItem(models.Model): cart = models.ForeignKey(Cart, on_delete=models.CASCADE, related_name='cartitems') product = models.ForeignKey(Product, on_delete=models.CASCADE) price = models.PositiveIntegerField() quantity = models.PositiveSmallIntegerField() @property def total_price(self): return int(self.price * self.quantity) def __str__(self): return self.product.title
ممکنه بگید که چرا باید یه مدل دیگه بین سبد خرید و محصولات باشه و چرا سبد خرید و محصولات را مستقیم به هم وصل نمی کنیم؟
مدل رابط ما (CartItem) باید یکسری اطلاعات دیگه ای از جمله تعداد اون محصول ، قیمت اون محصول هنگام خرید و ... را ذخیره کنه ، پس برای ذخیره این اطلاعات به این مدل میانی نیاز داریم.
ممکنه با شکل زیر بهتر قضیه را متوجه بشید :
توضیح فیلد های مدل CartItem :
total_price
}توضیح فیلد های مدل Cart :
total_price
}راه و روش های زیادی از جمله استفاده از سشن ها ( sessions ) برای ایجاد سبد خرید وجود داره که هر کدوم مزایا و معایب خودشون را دارند.
مدل های بالا به صورت ساده ترین شکل ممکن برای آموزش تعریف شدند شما به دلخواه خودتون میتونید فیلد هایی را به اونها اضافه یا کم کنید.