代金引換方式で支払うユーザーのみが利用できる特別なアイテムカテゴリを用意する必要がある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)
前の回答(自分で試したばかりなのでわかっています)には、次の行に1つの問題があります。
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)
たぶん私のコードは最もエレガントではありません。多分誰かがそれを改善し、そしておそらくそれを元の答えと統合することができます。