Используйте Джанго Оскар Сигналы - PullRequest
0 голосов
/ 12 ноября 2018

Я хочу отправить электронное письмо администратору, если размещен Заказ (в настоящее время только пользователь, разместивший заказ, получил электронное письмо). order_paced Оскар Сигнал может работать для меня здесь.

Для этого я уже разбудил приложение order, и внутри этого приложения в signals.py создана функция order_placed. Я также импортировал сигналы в 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 ----------------------")

1 Ответ

0 голосов
/ 19 января 2019

Для этого вам не нужны сигналы, так как часть потока платежей (каркаса) обеспечивает представление: PaymentDetailsView, которое со временем реализует миксин OrderPlacementMixin.

В таком миксине вы 'я найду метод: handle_successful_order, который является правильным местом для отправки сообщений, и сделаю другие вещи, убедившись, что заказ был размещен.

Так что не форк order app, форк 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)

Если вы прочитаете код этого метода в Оскаре, вы увидите, что именно там Оскар уведомляет пользователя о порядке, который былтолько что помещен.

Конечно, мы не можем игнорировать строку документации, которая гласит:

Переопределить это представление, если вы хотите выполнять настраиваемые действия при отправке заказа.

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...