我有一家 Satchmo 支持的商店,该商店需要一个特殊的商品类别,仅适用于通过货到付款方式付款的用户。
除了对结帐流程进行硬编码之外,是否有任何简单的方法可以将特定产品类别的付款方式限制为仅限货到付款?
解决方案是 Satchmo 几乎为每个动作发出信号,因此在构建支付方法表单时,您必须侦听特定信号,然后重新定义方法kwarg 变量,该变量将传递给侦听器:
from payment.signals import payment_methods_query
def on_payment_methods_query(sender, methods=None, cart=None, order=None, contact=None, **kwargs):
if not cart.is_empty:
for item in cart.cartitem_set.all():
special_products = settings.SPECIAL_PRODUCTS #(1, 15, 25, 75)
if item.product_id in special_products:
# methods is a list of (option_value, option_label) tuples
methods = [m for m in methods if m[0] in ('COD',)]
return
payment_methods_query.connect(on_payment_methods_query)
上一个答案有一个问题(我知道是因为我自己试过),在下面一行:
methods = [m for m in methods if m[0] in ('COD',)] # won't have the desired effect
问题是,在原始方法列表中,创建了一个全新的列表,并存储在相同的变量名中。这不会影响 Satchmo 传入的原始列表,因此 Satchmo 甚至不会知道。您需要做的实际上是使用“methods.remove(...)”之类的方法修改传入的列表对象。
在特定示例中,它应该是这样的:
disallowed_methods = [m for m in methods if m[0] not in ('COD',)]
for m in disallowed_methods:
methods.remove(m)
也许我的代码不是最优雅的;也许有人可以改进它,并可能将其与原始答案整合。