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

Posted

技术标签:

【中文标题】Django-Oscar 将用户交替发送到“付款详细信息”和“预览”或“感谢”页面【英文标题】:Django-Oscar sends users alternately to 'payment-details' and 'preview' or 'thank-you' page 【发布时间】:2018-09-26 15:32:29 【问题描述】:

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

    用户点击“继续结帐”按钮 PaymentMethodView 被调用 “付款详情”页面加载 用户点击“继续” Oscar 的“预览”加载。用户点击“下订单”并购买商品 用户被转到 Oscar 的“感谢”页面并收到一封电子邮件确认

我想要这个:

    “继续结帐”按钮已替换为 PayPal Checkout Express 客户端 checkout.js 按钮 用户点击 PayPal 按钮并付款 用户被转到 Oscar 的“感谢”页面并收到一封电子邮件确认

问题是这样的:PayPal 按钮可以正常工作,并且每次都可以成功付款,但是 Oscar 会在付款后交替将用户发送到“付款详细信息”页面和“感谢”页面。说清楚:

    用户购买了一件商品,并被发送到“谢谢”页面并收到一封电子邮件 用户购买了另一件商品,被发送到“付款详情”页面,但没有收到电子邮件,即使付款成功,Oscar 也没有注册购买 用户购买第三件商品并在步骤 1 中体验 Oscar 的响应 用户购买第四件商品并在步骤 2 中体验 Oscar 的响应 等等,无穷无尽

到目前为止,所有 url、视图和模型都可以完美运行。此时我唯一要做的就是用 PayPal 的按钮替换“继续结帐”按钮。

然后我删除了 PayPal 按钮,并恢复了“继续结帐”按钮,但只进行了一次编辑。按钮如下所示:<a href="% url 'checkout:index' %" class="...">% trans "Proceed to checkout" %</a>

我将'checkout:index' 替换为'checkout:preview' 以查看是否可以跳过“付款详细信息”页面。交替的情况继续。 Oscar 首先将用户引导至“预览”页面,然后在下一回合将用户引导至“付款详情”页面。

我也尝试过覆盖 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')

“付款详情”和“感谢”页面之间的交替仍然存在。

我没有想法。可能出了什么问题?

【问题讨论】:

所以你已经覆盖了checkout.views.IndexView 对吧?你能展示你的(编辑的)来源吗?此外,您的basket(其id 用于order_number)在付款成功/失败后没有得到正确处理(冻结/解冻/重置)可能值得调查。除非您显示您的 PaymentDetailsView 或您的 IndexView 自定义设置,否则不能说任何话。 @AshishNitinPatil 我没有覆盖 IndexView 和 PaymentDetailsView。我确实玩了 PaymentDetailsView 一点点,但我把它恢复为默认值。我会看看篮子,看看情况如何。谢谢! 奇怪,那么我不确定您是如何处理几乎单页的结帐的。无论如何,篮子问题肯定会引发错误,因此,除非您看到错误,否则您不应该真正担心这一点。 【参考方案1】:

结帐视图使用 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:
        ... 

【讨论】:

以上是关于Django-Oscar 将用户交替发送到“付款详细信息”和“预览”或“感谢”页面的主要内容,如果未能解决你的问题,请参考以下文章

如何向 django-oscar 添加新视图

如何在 html 文件之间交替并在它们之间发送数据?

交替最小二乘+ALS+推荐+Spark

当没有选择任何元素时如何在元素之间交替类并返回原始

Python 开源网上商城项目

让Android主屏幕小部件在textviews之间交替的最佳方式是啥?