【问题标题】:Django: determine which user is deleting when using post_delete signalDjango:使用 post_delete 信号时确定正在删除的用户
【发布时间】:2011-10-14 10:42:43
【问题描述】:

我希望在删除某些对象时通知管理员,但我也想确定哪个用户正在执行删除。

有可能吗?

这是代码:

# models.py
# signal to notify admins when nodes are deleted
from django.db.models.signals import post_delete
from settings import DEBUG

def notify_on_delete(sender, instance, using, **kwargs):
    ''' Notify admins when nodes are deleted. Only for production use '''
    if DEBUG:
        #return False
        pass
    # prepare context
    context = {
        'node': instance,
        'site': SITE
    }
    # notify admins that want to receive notifications
    notify_admins(instance, 'email_notifications/node-deleted-admin_subject.txt', 'email_notifications/node-deleted-admin_body.txt', context, skip=False)

post_delete.connect(notify_on_delete, sender=Node)

【问题讨论】:

    标签: python django django-models django-signals django-sessions


    【解决方案1】:

    我怀疑是否有可能使用内置信号(没有 User 隐式绑定到 delete 操作,并且由于 Django 的 loose coupling 数据库层不处理 HttpRequest 对象)。我会创建自己的信号,它提供一个user 参数,并在删除操作发生的任何视图中发送它,例如:

    # myapp/signals.py
    from django.dispatch import Signal
    my_post_delete = Signal(providing_args=['instance', 'user'])
    
    # myapp/models.py
    from myapp.signals import my_post_delete
    ...
    my_post_delete.connect(notify_on_delete, sender=Node)
    
    # myapp/views.py
    from myapp.signals import my_post_delete
    ...
    @login_required
    def my_delete_view(request, ...)
        ...
        instance = Node.objects.get(...)
        instance.delete()
        my_post_delete.send(sender=Node, instance=instance, user=request.user)
    

    【讨论】:

    • 如果信号由模型而不是视图发出不是更好吗?因此管理界面和第三方代码仍然可以工作?
    • @Jack M. 我想这样会更好,但是你怎么知道哪个User 在没有request 的情况下进行删除?
    猜你喜欢
    • 1970-01-01
    • 2015-02-18
    • 2018-02-04
    • 2021-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-15
    • 2016-01-09
    相关资源
    最近更新 更多