python - 通过 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'))
解决方案
我猜你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'))
推荐阅读
- python - 情节上不需要的调色板
- python - 如果在 Python 中调用函数列表中的任何函数,则自动触发函数
- amazon-web-services - 无法在 AWS SES 上设置停止操作
- .htaccess - TYPO3 HTACCESS | 在 url 中将 HTTPS 更改为 HTTP 会将我重定向到根页面
- r - 使用按类别的增长率填充 data.table 中的缺失值
- c++ - 继承和覆盖虚拟赋值 == 运算符
- java - 范围报告框架-如何获取存储在范围报告日志功能中的值
- java - 从容器内部连接到 PostgreSQL 容器的问题
- json - URLSession.shared.dataTask 返回零字节
- oracle - 我正在尝试使用一个程序每分钟自动更新一次顶点日历