【问题标题】:Use Django Oscar Signals使用 Django Oscar 信号
【发布时间】:2018-11-12 10:38:39
【问题描述】:

如果下订单,我想向管理员发送电子邮件(目前只有下订单的用户会收到电子邮件)。 order_pacedOscar Signal 可以在这里为我工作。

为此,我已经分叉了order 应用程序,并在此应用程序内部order_placed 函数在signals.py 中创建。我还在config.py 中导入了信号,但是当我从网站下订单时,这个order_placed 仍然没有被解雇。

谁能分享任何奥斯卡信号使用的例子?

代码:

config.py

from oscar.apps.order import config


class OrderConfig(config.OrderConfig):
    name = 'catalogue.order'
    
    def ready(self):
        from oscar.apps.order import signals

signals.py

from django.db.models.signals import post_save
from django.dispatch import receiver

from oscar.apps.order.models import Order

@receiver(post_save, sender=Order)
def order_placed(*args, **kwargs):
    """
    :param args:
    :param kwargs:
    :return:
    """

    print("i ma here ----------------------")

【问题讨论】:

  • 请显示您的信号处理程序的相关代码以及您如何/在何处将其连接到信号。
  • @schwobaseggl 我已经编辑了我的问题
  • 您必须在应用配置的ready 中导入自定义signals 模块,而不是来自oscar 的模块,以便在应用加载时连接自定义接收器。
  • @schwobaseggl 哎呀我的错。非常感谢 。您可以将此作为答案发布,以便我接受。
  • 另外,我想指出,在这种情况下,不需要分叉 order 应用程序(除非您要更改信号的发送方式)。您可以在现有代码库的其他地方简单地 import signal 并将其用作接收器。

标签: python django django-signals django-oscar


【解决方案1】:

您不需要为此发出信号,作为支付流程(框架)的一部分,oscar 提供了视图:PaymentDetailsView,它及时实现了 mixin OrderPlacementMixin

在这样的 mixin 中,您会找到方法:handle_successful_order,这是发送消息的正确位置,并执行其他操作以确保已下订单。

所以,不要 fork order app,fork checkout app 并重写此方法以执行以下操作:

from django.conf import settings

class PaymentDetailView:
    # ...
    def handle_successful_order(order):
        send_mail_to_admin(settings.ADMIN_EMAIL_ADDRESS)
        super(PaymentDetailView, self).handle_successful_order(order)

如果您在 oscar 中阅读此方法的代码,您会发现这确实是 oscar 通知用户刚刚下订单的地方。

当然,我们不能忽略以下说明的文档字符串:

如果您想在以下情况下执行自定义操作,请覆盖此视图 订单已提交。

def handle_successful_order(self, order):
    """
    Handle the various steps required after an order has been successfully
    placed.

    Override this view if you want to perform custom actions when an
    order is submitted.
    """
    # Send confirmation message (normally an email)
    self.send_confirmation_message(order, self.communication_type_code)

    # Flush all session data
    self.checkout_session.flush()

    # Save order id in session so thank-you page can load it
    self.request.session['checkout_order_id'] = order.id

    response = HttpResponseRedirect(self.get_success_url())
    self.send_signal(self.request, response, order)
    return response

【讨论】:

    【解决方案2】:

    就像@raydel-miranda 指出的那样,当客户下订单时,您不需要信号来向管理员发送电子邮件。

    只需使用./python manage.py oscar_fork_app checkout apps fork 结帐应用程序

    在上述分叉结账应用程序中创建 views.py 文件并使用此代码覆盖默认的 oscar checkout/views.py 文件。

    yourproject_name/apps/checkout/views.py

    from django.conf import settings
    from django.views.generic import FormView
    from django.contrib import messages
    
    
    from django.core.mail import EmailMessage,send_mail
    
    OscarPaymentDetailsView = get_class("checkout.views", "PaymentDetailsView")
    
    
    class PaymentDetailsView(CheckCountryPreCondition, OscarPaymentDetailsView):
        
        def handle_successful_order(self, order):
            print('order creted') 
            send_mail(
            subject="New Order Needs attention",
            message='Please login the dashboard and complete the order',
            from_email=(settings.EMAIL_HOST_USER),
            recipient_list=['admin_email_address_1', 'admin_email_address_2'], #x.email for x in partner_id.users.all()
            fail_silently=False,
            )
            ctx=super(PaymentDetailsView, self).handle_successful_order(order)
            #send_mail_to_admin(settings.ADMIN_EMAIL_ADDRESS)
            
    

    这可以节省其他人在下订单时尝试创建用于发送管理员电子邮件的信号的优质时间。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多