如何在Django中将其他视图和模型添加到通用详细信息视图中

时间:2020-05-04 19:53:19

标签: python django django-models django-views e-commerce

我正在创建一个django电子商务网站。 我的购物车页面显示了商品,数量,价格和所有订单内容。我正在创建一个微型购物车,当用户将鼠标悬停在购物车图标上时,该购物车会显示在所有页面上,该图标显示所有这些数据,用户可以单击它以转到购物车页面。 这在我所有其他页面(产品页面和购物车页面)上都起作用,但是我似乎无法为每种产品在我的DetailView页面中添加所需的变量。

与此相关的模型是:

class Product(models.Model):
    name = models.CharField(max_length=200, null=True)
    price = models.FloatField(max_length=200)
    description = models.TextField(max_length=500, default='No description')
    digital = models.BooleanField(default=False, null=True, blank=False)
    image_1 = models.ImageField(null=True, blank=False, default='')
    image_2 = models.ImageField(null=False, blank=True, default='')
    image_3 = models.ImageField(null=False, blank=True, default='')
    images = [image_1,image_2,image_3,]

    def __str__(self):
        return self.name

    def get_absolute_url(self):
        return reverse('product-detail', kwargs={'pk':self.pk})


class Order(models.Model):
    customer = models.ForeignKey(Customer, on_delete=models.SET_NULL, blank=True, null=True)
    date_ordered = models.DateTimeField(auto_now_add=True)
    complete = models.BooleanField(default=False, null=True, blank=False)
    transaction_id = models.CharField(max_length=200, null=True)

    def __str__(self):
        return str(self.id)

    @property
    def shipping(self):
        shipping = False
        orderitems = self.orderitem_set.all()
        for i in orderitems:
            if i.product.digital == False:
                shipping = True
        return shipping

    @property
    def get_cart_total(self):
        orderitems = self.orderitem_set.all()
        total = sum([item.get_total for item in orderitems])
        return total

    def get_cart_items(self):
        orderitems = self.orderitem_set.all()
        total = sum([item.quantity for item in orderitems])
        return total


class OrderItem(models.Model):
    product = models.ForeignKey(Product, on_delete=models.SET_NULL, blank=True, null=True)
    order = models.ForeignKey(Order, on_delete=models.SET_NULL, blank=True, null=True)
    quantity = models.IntegerField(default=0, null=True, blank=True)
    date_added = models.DateTimeField(auto_now_add=True)

    @property
    def get_total(self):
        total = self.product.price * self.quantity
        return total

我的看法是:

def products(request):

    if request.user.is_authenticated:
        customer = request.user.customer
        order, created = Order.objects.get_or_create(customer=customer, complete=False)
        items = order.orderitem_set.all()
        cartItems = order.get_cart_items
    else:
        items = []
        order = {'get_cart_total':0, 'get_cart_items':0, 'shipping':False}
        cartItems = order['get_cart_items']

    products = Product.objects.all()
    context = {'items':items, 'order':order,'products':products, 'cartItems':cartItems}
    return render(request, 'store/products.html', context)

def cart(request):
    if request.user.is_authenticated:
        customer = request.user.customer
        order, created = Order.objects.get_or_create(customer=customer, complete=False)
        items = order.orderitem_set.all()
        cartItems = order.get_cart_items
    else:
        items = []
        order = {'get_cart_total':0, 'get_cart_items':0, 'shipping':False}
        cartItems = order['get_cart_items']
    context = {'items':items, 'order':order, 'cartItems':cartItems}
    return render(request, 'store/cart.html', context)

class ProductDetailView(DetailView):
    model = Product

因此,基本上,我需要使ProductDetailView获得商品和订单的上下文,因为我使用这些变量在我的DetailView页面“迷你购物车”中显示了订单商品。很长的代码,我很抱歉,但是我不确定需要哪些代码。 我如何在我的DetailView中添加“ items”和“ order”上下文,类似于我对其他视图所做的操作?

0 个答案:

没有答案