Создание сигнала django для обновления пользовательских данных - PullRequest
6 голосов
/ 19 августа 2010

Я работаю над проектом django, где хочу реализовать сигнал, который должен вызываться при изменении какого-либо пользовательского адреса. Я видел встроенные сигналы, но они, похоже, не работают в моем случае, потому что, если я использую функцию сохранения, она будет вызываться и в других событиях сохранения, и, хотя я могу создать собственный сигнал, я не смогу найти как мне это назвать?

Пожалуйста, предложите.

Заранее спасибо.

Ответы [ 2 ]

16 голосов
/ 19 августа 2010

Начните с определения пользовательского сигнала.Пользовательский сигнал здесь является подклассом django.dispatch.Signal.Этот код может находиться в app/signals.py.

from django.dispatch import Signal
user_address_changed = Signal(providing_args=["user"])

Далее, убедитесь, что вы отправили этот сигнал при изменении адреса вашего пользователя.В зависимости от того, как вы определили User и Address, это можно сделать в разных местах.Предположим, что существует представление, позволяющее пользователям обновлять свои Address модели.Этот код предположительно находится в app/views.py.

from app import signals

def update_address(request, *args, **kwargs):
    # all the changes go well.
    signals.user_address_changed.send(sender=None, user=request.user)
    # Render to template etc.

Теперь вам нужно настроить приемник для этого сигнала.

from app.signals import user_address_changed

def handle_user_address_change(sender, **kwargs):
    """Trap the signal and do whatever is needed"""
    user = kwargs['user']
    # Write to log, update db, send mail etc.

user_address_changed.connect(handle_user_address_change)

Обновление

(После прочтения комментария; OP объясняет, что не существует отдельного представления для обновления адреса). В этом случае вы можете попытаться переопределить User.save() чтобы отправить этот сигнал.Я говорю «попробуй», потому что я не знаю, используете ли вы свой User класс или auth.User.

1 голос
/ 02 марта 2012

Вы можете оценить django-signalqueue:

https://github.com/fish2000/django-signalqueue

Это расширение диспетчера сигналов запаса, предоставляющее класс AsyncSignal. Обратные вызовы AsyncSignal могут выполняться в отдельном рабочем потоке - вы можете управлять определенным поведением определенных вами асинхронных прослушивателей.

(полное раскрытие: я написал.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...