我正试图截断Django-Oscar的结账流程。假设我们从购物篮/购物车开始,默认流程如下:
我想改为:
问题在于:每次PayPal按钮都能正常工作并且付款成功,但Oscar会在付款后交替将用户发送到“付款详细信息”页面和“谢谢”页面。要明确:
所有网址,观点和模型都完美地完成了这一点。我在这一点上唯一做的就是用PayPal的按钮取代“继续结账”按钮。
然后我删除了PayPal按钮,并恢复了“继续结帐”按钮,但只进行了一次编辑。按钮如下所示:<a href="{% url 'checkout:index' %}" class="...">{% trans "Proceed to checkout" %}</a>
。
我将'checkout:index'
替换为'checkout:preview'
以查看是否可以跳过“付款详情”页面。交替的情况仍在继续。奥斯卡首先将用户发送到“预览”页面,然后在下一个回合中将用户发送到“付款详细信息”页面。
我也尝试重写PaymentMethodView:
from oscar.apps.checkout.views import PaymentMethodView as BasePaymentMethodView
from django.shortcuts import redirect
class PaymentMethodView(BasePaymentMethodView):
def get_success_response(self):
return redirect('thank-you')
“付款细节”和“谢谢你”页面之间的交替仍然存在。
我没有想法。什么可能出错?
答案 0 :(得分:1)
checkout视图使用skip_conditions和pre_conditions属性来确定要显示的视图,并且所有视图都实现了get_pre_conditions()和get_skip_conditions()方法,您可以使用它来更改默认行为。因此,购买物品后可能无法满足其中一些先决条件。
还有一个PassedSkipCondition和FailedPreCondition异常可用于重定向。
我会告诉你我是如何处理类似情况的。以下方法来自我的自定义PaymentDetailsView,我在其中覆盖skip_unless_payment_is_required。我的网上商店有一个手动取件选项,客户可以在此处下订单,但只能在取货时付款。因此,我提出了一个PassedSkipCondition异常,强制客户转到预览页面。
def skip_unless_payment_is_required(self, request):
# Check to see if payment is actually required for this order.
shipping_address = self.get_shipping_address(request.basket)
shipping_method = self.get_shipping_method(request.basket, shipping_address)
if shipping_method:
shipping_charge = shipping_method.calculate(request.basket)
# CUSTOMER WILL MANUALLY PICKUP ITEMS, SO SKIP PAYMENT DETAILS PAGE!
if shipping_method.code == 'MANUAL_PICKUP':
raise exceptions.PassedSkipCondition(url=reverse('checkout:preview'))
else:
...