我正在开发一个django项目,我希望实现一个信号,当某个用户地址被更改时应该调用该信号。我已经看到了内置信号,但它们似乎在我的情况下不起作用,因为如果我使用save也将在其他保存事件中调用,虽然我能够创建自定义信号,但我找不到,我应该怎么称呼它?
请建议。
提前致谢。
答案 0 :(得分:16)
首先定义自定义信号。这里的自定义信号是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 :(得分:1)
你可能会欣赏django-signalqueue:
https://github.com/fish2000/django-signalqueue
它是提供AsyncSignal类的股票信号调度程序的扩展。 AsyncSignal回调可以在单独的工作线程上执行 - 您可以控制您定义的异步侦听器的特定行为。
(完全披露:我写了。)