Django-Oscar交替向用户发送“付款详细信息”和“预览”或“谢谢”页面

时间:2018-04-16 19:37:52

标签: django-oscar

我正试图截断Django-Oscar的结账流程。假设我们从购物篮/购物车开始,默认流程如下:

  1. 用户点击“继续结帐”按钮
  2. PaymentMethodView被称为
  3. 'payment-details'页面加载
  4. 用户点击“继续”
  5. 奥斯卡的'预览'加载。用户点击“下订单”并购买商品
  6. 用户被发送到奥斯卡的“谢谢”页面并收到确认电子邮件
  7. 我想改为:

    1. “继续结帐”按钮被PayPal Checkout Express客户端checkout.js按钮取代
    2. 用户点击PayPal按钮并付款
    3. 用户被发送到奥斯卡的“谢谢”页面并收到确认电子邮件
    4. 问题在于:每次PayPal按钮都能正常工作并且付款成功,但Oscar会在付款后交替将用户发送到“付款详细信息”页面和“谢谢”页面。要明确:

      1. 用户购买商品,然后发送到“感谢您”页面并收到电子邮件
      2. 用户购买另一件商品,发送到“付款详细信息”页面并且没有收到电子邮件,即使付款通过,奥斯卡也没有注册购买
      3. 用户购买第三项并在步骤1中体验奥斯卡的回复
      4. 用户购买第四项并在第2步中体验奥斯卡的回复
      5. 所以广告无限
      6. 所有网址,观点和模型都完美地完成了这一点。我在这一点上唯一做的就是用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')
        

        “付款细节”和“谢谢你”页面之间的交替仍然存在。

        我没有想法。什么可能出错?

1 个答案:

答案 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:
        ...