为用户详细信息更新创建django信号

时间:2010-08-19 10:45:13

标签: django

我正在开发一个django项目,我希望实现一个信号,当某个用户地址被更改时应该调用该信号。我已经看到了内置信号,但它们似乎在我的情况下不起作用,因为如果我使用save也将在其他保存事件中调用,虽然我能够创建自定义信号,但我找不到,我应该怎么称呼它?

请建议。

提前致谢。

2 个答案:

答案 0 :(得分:16)

首先定义自定义信号。这里的自定义信号是django.dispatch.Signal的子类。此代码可以存在app/signals.py

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

接下来,确保在更改用户地址时发送此信号。根据您定义UserAddress的方式,这可以在不同的地方完成。我们假设有一个视图允许用户更新他们的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 :(得分:1)

你可能会欣赏django-signalqueue:

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

它是提供AsyncSignal类的股票信号调度程序的扩展。 AsyncSignal回调可以在单独的工作线程上执行 - 您可以控制您定义的异步侦听器的特定行为。

(完全披露:我写了。)