django - 如何调用方法并将其传递给 django 中另一个类模型的字段?
问题描述
我正在创建一个电子商务 Web 应用程序。我已完成添加到购物车并正在构建提款视图。我在获取订购商品的总价格时遇到问题。
模型.py
class OrderItem(models.Model):
user = models.ForeignKey(settings.AUTH_USER_MODEL,
on_delete=models.CASCADE)
item = models.OneToOneField(Item, on_delete=models.CASCADE)
quantity = models.IntegerField(default=1)
ordered = models.BooleanField(default=False)
def __str__(self):
return f"{self.quantity} of {self.item.title}"
def get_total_item_price(self):
return self.quantity * self.item.price
def get_final_price(self):
return self.get_total_item_price()
class Order(models.Model):
user = models.ForeignKey(settings.AUTH_USER_MODEL,
on_delete=models.CASCADE)
items = models.ManyToManyField(OrderItem)
start_date = models.DateTimeField(auto_now_add=True)
ordered_date = models.DateTimeField()
ordered = models.BooleanField(default=False)
total_price = models.IntegerField(default=0)
def __str__(self):
return self.user.username
def get_total(self):
total = 0
for order_item in self.items.all():
total += order_item.get_final_price()
return total
def save(self, *args, **kwargs):
self.total_price = self.get_total()
return super().save(*args, **kwargs)
我试图覆盖Order 类的保存函数,以将价格总额传递给total_price 字段。我没有收到任何错误消息,但该字段不会更新。它仍然显示默认值而不是总价格。
视图.py
class OrderSummaryView(LoginRequiredMixin, DetailView):
def get(self, request, *args, **kwargs):
try:
order = Order.objects.get(user=self.request.user, ordered=False)
context = {
'object': order
}
return render(self.request, 'ecommpage/order_summary.html', context)
except ObjectDoesNotExist:
messages.error(self.request, "You do not have an active order")
return redirect('/')
@login_required
def add_to_cart(request, slug):
item = get_object_or_404(Item, slug=slug)
order_item, created = OrderItem.objects.get_or_create(
item=item,
user=request.user,
ordered=False,
)
order_qs = Order.objects.filter(user=request.user, ordered=False)
if order_qs.exists():
order = order_qs[0]
# check if the order item is in the order
if order.items.filter(item__slug=item.slug).exists():
order_item.quantity += 1
order_item.save()
messages.success(request, "This item was updated to your cart.")
else:
messages.success(request, "This item was added to your cart.")
order.items.add(order_item)
else:
ordered_date = timezone.now()
order = Order.objects.create(
user=request.user, ordered_date=ordered_date)
order.items.add(order_item)
messages.success(request, "This item was added to your cart.")
return redirect("product", slug=slug)
@login_required
def remove_from_cart(request, slug):
item = get_object_or_404(Item, slug=slug)
order_qs = Order.objects.filter(
user=request.user,
ordered=False
)
if order_qs.exists():
order = order_qs[0]
# check if the order item is in the order
if order.items.filter(item__slug=item.slug).exists():
order_item = OrderItem.objects.filter(
item=item,
user=request.user,
ordered=False
)[0]
if order_item.quantity > 1:
order_item.quantity -= 1
order_item.save()
else:
order.items.remove(order_item)
messages.warning(request, "This item was removed from your cart.")
return redirect("product", slug=slug)
else:
messages.warning(request, "This item was not in your cart.")
return redirect("product", slug=slug)
else:
messages.warning(request, "You do not have an active order")
return redirect("product", slug=slug)
解决方案
推荐阅读
- c# - Powershell System.Management.Automation Reference assembly 4.0 中的“Write-Host”输出的位置
- angular - 函数从 pouchDB 获取委托,插入一些调试数据并返回一个承诺
- networking - 如何使用容器中的主机 IP?
- sql - 如何从主表单以线性方式更新多个子表单记录?
- node.js - 为什么multer应该在任何操作之前上传文件?
- node.js - setup/index.sh mongo:未找到
- php - 尝试 get_results 时 PHP 崩溃
- javascript - 我可以将 .map 数组转换为带双引号的逗号分隔数组吗?
- functional-programming - 如何在纯 FP 中强制执行“单一事实来源”?
- c# - JsonResult 在 ASP.NET CORE 2.1 中返回 Json