首页 > 解决方案 > 通过 For-Loop 添加数据删除旧数据

问题描述

我创建了一个电子商务项目。我有 3 个模型。项目,购物车项目,Placeorder(结帐)。我正在遍历包含多个项目的用户购物车,以便我可以获取每个项目并创建一个 placeorder 实例。但是 for 循环仅在第一次时有效,当我尝试再次使用多个项目下订单(结帐)时,旧数据(记录)被删除并替换为 for 循环中的新数据。我不明白这种行为。我无法克服这一点。也许我犯了一些愚蠢的错误。

模型.py

SUB_CATEGORY_CHOICES = (
    ('Veg','Veg'),
    ('Non-Veg','Non-Veg'),
)


QUANTITY_CHOICES = (
    ('Half','Half'),
    ('Full','Full')
)
class Item(models.Model):
    name            =models.CharField(max_length=1000)
    description     =models.CharField(max_length=2000)

    # snacks, maincourse, soups, rice, ice-cream
    category        =models.CharField(max_length=1000)
    # veg, non-veg
    # sub_category    =models.CharField(max_length=1000,blank=True,null=True)
    sub_category    =models.CharField(choices=SUB_CATEGORY_CHOICES, max_length=1000)

    images1         =models.FileField(upload_to='food_image',blank=True,null=True)
    images2         =models.FileField(upload_to='food_image',blank=True,null=True)
    price           =models.CharField(max_length=500)
    add_date        =models.DateTimeField(default=timezone.now)
    # half, full
    quantity_size   =models.CharField(choices=QUANTITY_CHOICES,max_length=1000, blank=True,null=True)

    avg_rating      =models.FloatField(default='0',blank=True,null=True)

    def __str__(self):
        return '%s - %s - %s' % (self.id,self.name,self.price)

    class Meta:
        ordering = ['-add_date']

class CartItem(models.Model):
    user            = models.ForeignKey(User, on_delete=models.CASCADE)
    the_item        = models.ForeignKey(Item, on_delete=models.CASCADE)
    quantity        = models.IntegerField(default=1)
    price           = models.IntegerField()

    def __str__(self):
        return '%s - %s' % (self.the_item.name, self.the_item.sub_category)

class Placeorder(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    order_items = models.ForeignKey(CartItem, on_delete=models.CASCADE)
    item_quantity = models.IntegerField(default=1)
    first_name = models.CharField(max_length=200, null=True)
    last_name = models.CharField(max_length=200, null=True)

    shipping_phone_number = models.IntegerField(null=True)
    shipping_address_1 = models.CharField(max_length=500, null=True)
    shipping_address_2 = models.CharField(max_length=500, null=True)
    shipping_city = models.CharField(max_length=200, null=True)
    shipping_district = models.CharField(max_length=200, null=True)
    shipping_state = models.CharField(max_length=200, null=True)
    shipping_zipcode = models.IntegerField(null=True)

    billing_phone_number = models.IntegerField(null=True)
    billing_address_1 = models.CharField(max_length=500, null=True)
    billing_address_2 = models.CharField(max_length=500, null=True)
    billing_city = models.CharField(max_length=200, null=True)
    billing_district = models.CharField(max_length=200, null=True)
    billing_state = models.CharField(max_length=200, null=True)
    billing_zipcode = models.IntegerField(null=True)

    payment_mode = models.CharField(default='', max_length=100,null=False,blank=False)

    date_added = models.DateTimeField(default=timezone.now)
    delivered = models.BooleanField(default=False)
    customer_delivered = models.BooleanField(default=False)

    def __str__(self):
        return f'{self.user.username} -- {self.order_items.the_item}'

视图.py

def checkout_page(request):
    items = CartItem.objects.filter(user=request.user)
    cart_total = CartItem.objects.filter(user=request.user).aggregate(Sum('price'))

    context = {
        'cart_total': cart_total['price__sum'],
        'items':items,
        'total_items':len(items),
    }
    return render(request, 'resto/newcheckout.html', context)

def checkout_action(request):
    items = CartItem.objects.filter(user=request.user)

    if request.method == 'POST':
        shipping_phone_number = request.POST.get('shipping_phone_number')
        shipping_address_1 = request.POST.get('shipping_address_1')
        shipping_address_2 = request.POST.get('shipping_address_2')
        shipping_city = request.POST.get('shipping_city')
        shipping_district = request.POST.get('shipping_district')
        shipping_state = request.POST.get('shipping_state')
        shipping_zipcode = request.POST.get('shipping_zipcode')

        billing_phone_number = request.POST.get('billing_phone_number')
        billing_address_1 = request.POST.get('billing_address_1')
        billing_address_2 = request.POST.get('billing_address_2')
        billing_city = request.POST.get('billing_city')
        billing_district = request.POST.get('billing_district')
        billing_state = request.POST.get('billing_state')
        billing_zipcode = request.POST.get('billing_zipcode')

        payment_mode = request.POST.get('COD')

        same_billing_address = request.POST.get('same_billing_address')
        for item in items:

            checkout_item = CartItem.objects.get(id=item.id)
            print('item.pk: ', item.pk)
            checkout_instance = Placeorder(
                                    user=request.user,
                                    order_items=item,
                                    item_quantity=item.quantity,
                                    first_name=request.user.first_name,
                                    last_name=request.user.last_name,

                                    shipping_phone_number=shipping_phone_number,
                                    shipping_address_1=shipping_address_1,
                                    shipping_address_2=shipping_address_2,
                                    shipping_city=shipping_city,
                                    shipping_district=shipping_district,
                                    shipping_state=shipping_state,
                                    shipping_zipcode=shipping_zipcode,
                                    )
            checkout_instance.save()
            return HttpResponseRedirect(reverse('myorders'))

标签: pythondjangofor-loopdjango-modelsdjango-views

解决方案


我猜你return HttpResponseRedirect(reverse('myorders'))应该有更少的缩进,否则你会在第一次循环迭代后返回

def checkout_action(request):
    items = CartItem.objects.filter(user=request.user)

    if request.method == 'POST':
        ...
        for item in items:
            ...
        return HttpResponseRedirect(reverse('myorders'))

推荐阅读