Django Oscar 在兑换过期凭证时自动清空购物篮

Django Oscar automatically empties the basket on redeeming an expired voucher

当客户将代金券应用于购物车中的商品并且代金券在结帐过程中或在购物车本身内过期时。在结账过程中,当点击 place order 时,购物车自动清空并且向客户发送此错误 You need to add some items to your basket to checkout,这发生在 check_basket_is_not_empty method 期间。

谁能帮我理解 Django-Oscar 的哪一部分可能会以如此激烈的方式修改购物车。我最初的想法是,购物车被清空是因为某些 oscar 组件试图删除优惠券并同时删除购物车项目。但是在进行更多检查时,我发现优惠券已成功移除,但购物车商品可能仅在 PaymentDetailsView 内被移除。

我没有 PaymentDetailsView 的代码。几天前我开始了 Django 开发人员的工作,我被扔进了这个我完全不熟悉的庞大的 django-oscar 代码库。我不允许在线 post 任何代码。我不知道该怎么办,也不想被解雇。任何帮助将不胜感激。

我仍然不知道是什么导致了这个错误,但我想出了这个解决方案。当您点击 "place order" 时, PaymentDetailsView class 被触发,第一个处理所有数据的函数是 submit 函数。因此,在其中,您可以手动检查 request 中的凭证并手动删除凭证。

# removing expired vouchers:
for voucher in self.request.basket.vouchers.all():
     if voucher.is_expired() or not voucher.is_available_to_user(user=self.request.basket.owner)[0]:
        self.request.basket.vouchers.remove(voucher)
        messages.error(self.request,_("The '%(code)s' voucher has expired") % {'code': voucher.code})