Django电商支付函数添加商品未售判断条件求助
解决方案
你可以通过两种方式实现这个判断逻辑,下面是具体的代码实现:
方法一:ORM查询(高效简洁)
直接用ORM查询快速验证购物车中是否存在已售商品,性能更优,适合只需要提示存在已售商品的场景:
from django.contrib import messages from django.shortcuts import redirect def acc_go_to_gateway_view(request): cart_items = AccountCart.objects.filter(user=request.user) # 检查购物车是否存在已售商品 has_sold_items = cart_items.filter(product__sold=True).exists() if has_sold_items: messages.error(request, "购物车中存在已售罄商品,请移除后再尝试支付") return redirect('你的购物车页面路由名称') # 替换为实际的购物车页面路由 # 原有总价计算逻辑 total_price = 0 if cart_items: for item in cart_items: total_price += (item.product.price) * item.quantity amount = total_price user_mobile_number = '' factory = bankfactories.BankFactory() try: bank = factory.auto_create() bank.set_request(request) bank.set_amount(amount) bank.set_client_callback_url('/acc-callback-gateway') bank.set_mobile_number(user_mobile_number) bank_record = bank.ready() return bank.redirect_gateway() except AZBankGatewaysException as e: logging.critical(e) raise e
方法二:遍历购物车项检查
如果需要明确提示用户哪些商品已售,可以遍历每个购物车项收集信息:
from django.contrib import messages from django.shortcuts import redirect def acc_go_to_gateway_view(request): cart_items = AccountCart.objects.filter(user=request.user) sold_product_names = [] # 遍历检查每个商品状态 for item in cart_items: if item.product.sold: sold_product_names.append(item.product.name) if sold_product_names: messages.error(request, f"以下商品已售罄:{', '.join(sold_product_names)},请移除后再支付") return redirect('你的购物车页面路由名称') # 原有总价计算逻辑 total_price = 0 if cart_items: for item in cart_items: total_price += (item.product.price) * item.quantity amount = total_price user_mobile_number = '' factory = bankfactories.BankFactory() try: bank = factory.auto_create() bank.set_request(request) bank.set_amount(amount) bank.set_client_callback_url('/acc-callback-gateway') bank.set_mobile_number(user_mobile_number) bank_record = bank.ready() return bank.redirect_gateway() except AZBankGatewaysException as e: logging.critical(e) raise e
注意事项
- 确保项目已启用Django的
messages框架(默认已启用,需确认INSTALLED_APPS包含django.contrib.messages,中间件包含django.contrib.messages.middleware.MessageMiddleware)。 - 替换代码中的
'你的购物车页面路由名称'为实际的购物车页面路由别名,比如'cart:index'。 - 若你的
AccountProduct模型并非直接包含sold字段,而是通过外键关联Product模型,需将product__sold调整为product__product__sold(根据实际关联路径修改)。
内容的提问来源于stack exchange,提问作者Essiprog
相关产品推荐
相关产品推荐

