Ali Rahmani
Ali Rahmani
خواندن ۳ دقیقه·۴ سال پیش

ساخت سبد خرید در جنگو

مطمعناً یکی از مهمترین قسمت های یک سایت فروشگاهی طراحی قسمت سبد خرید آن است.

برای ایجاد سبد خرید در جنگو روش های متفاوتی وجود دارد.

در این آموزش میخواهیم با استفاده از مدل های جنگو سبد خرید خودمون را طراحی کنیم.



برا مدل محصولات خودمون از مدل زیر استفاده میکنیم :

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 :

  • برای اینکه بدونیم این ابجکت برای کدوم سبد خرید هست. { cart }
  • برای اینکه بدونیم این این ابجکت برای کدوم محصول است. { product }
  • این فیلد قیمت محصول را توی خودش ذحیره میکنه و ثابت نگه میداره تا اگه بعداً قیمت اون محصول بیشتر شد بدونید که این محصول قبلا به چه قیمتی فروش رفته. { price }
  • این فیلد مقداری را توی خودش ذخیره میکنه که نشون میده کاربر قصد خرید چه تعداد از اون محصول را داشته. { quantity }
  • این متد تعداد را در قیمت ضرب میکنه و قیمت کل را به ما میده. { total_price }


توضیح فیلد های مدل Cart :

  • برای اینکه بدونیم این سبد خرید برای کدوم کاربر هست. { user }
  • برای اینکه بدونیم این سبد خرید پرداخت شده است یا نه { is_paid }
  • این متد قیمت کل همه cartitem های اون سبد را جمع میکنه و قیمت کل سبد خرید ( اون مبلغی که کاربر باید پرداخت کنه ) را به ما میده. { total_price }




راه و روش های زیادی از جمله استفاده از سشن ها ( sessions ) برای ایجاد سبد خرید وجود داره که هر کدوم مزایا و معایب خودشون را دارند.

مدل های بالا به صورت ساده ترین شکل ممکن برای آموزش تعریف شدند شما به دلخواه خودتون میتونید فیلد هایی را به اونها اضافه یا کم کنید.




سبد خرید در جنگوُسبد خریدجنگوdjangopython
جوجه برنامه نویس
شاید از این پست‌ها خوشتان بیاید