首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Django中,当一个组添加或删除用户时,我如何获得一个信号?

在Django中,当一个组添加或删除用户时,我如何获得一个信号?
EN

Stack Overflow用户
提问于 2011-10-26 13:55:04
回答 4查看 2.3K关注 0票数 4

在Django admin中,我有时会在(现有)组中添加或删除用户。当这种情况发生时,我希望能够运行一个函数。

我只是使用标准的用户和组模型。

我已经考虑过通过m2m_changed用信号来做这件事,但它似乎需要一个直通类--我不认为在这种情况下有一个直通类。

EN

回答 4

Stack Overflow用户

发布于 2011-11-24 18:57:22

django doc

发送器-描述ManyToManyField的中间模型类。这个类是在定义多对多字段时自动创建的;您可以使用多对多字段上的through属性来访问它。

订阅m2m_changed时,如下所示:

代码语言:javascript
运行
复制
@receiver(m2m_changed)
def my_receiver(**kwargs):
    from pprint import pprint
    pprint(kwargs)

你会收到一堆这样的信号(缩写):

代码语言:javascript
运行
复制
{'sender': <class 'django.contrib.auth.models.User_groups'>,
 'action': 'post_add',
 'instance': <User: bouke>,
 'model': <class 'django.contrib.auth.models.Group'>,
 'pk_set': set([1]),
 'reverse': False,
 'signal': <django.dispatch.dispatcher.Signal object at 0x101840210>,
 'using': 'default'}

因此,用户bouke已被添加到pk_set groups:[1]。但是,我注意到admin布局清除了所有组,然后将选定的组添加回来。您将收到的信号是pre_clearpost_clearpre_addpost_add。使用这些信号的组合,您可以存储pre和post组。通过对这些列表进行比较,您可以获得用户的已删除组和已添加组。

请注意,当编辑组而不是用户时,信号是相反的(pk_setinstance)。

票数 6
EN

Stack Overflow用户

发布于 2018-06-26 06:01:49

您将在Django documentation (v1.11)中看到,所需的发送方应该是属于ManyToMany字段的中间through字段,无论该字段是在何处定义的。如果你将它注册为你的发送者,那么你将会听到例如用户向他们自己添加组,以及组向他们自己添加用户。

代码语言:javascript
运行
复制
self.walrus.groups.remove(self.peon_group)

@receiver(signal=m2m_changed, sender=User.groups.through)
def adjust_group_notifications(instance, action, reverse, model, pk_set, using, *args, **kwargs):
    if model == Group and not reverse:
        logger.info("User %s deleted their relation to groups «%s»", instance.username, pk_set)
        if action == 'post_remove':
            # The *modification* happening is a deletion of the link
            …
        elif action == 'post_add':
           logger.info("User %s created a relation to groups «%s»", instance.username, ", ".join(pk_set))
            …
    else:
        logger.info("Group %s is modifying its relation to users «%s»", instance, pk_set)
        …
    return
票数 3
EN

Stack Overflow用户

发布于 2018-04-11 04:39:01

您需要使用m2m_changed作为接收器来创建信号。根据the official Django documentation的说法

当模型实例上的ManyToManyField发生更改时,将发送信号。严格地说,这不是一个模型信号,因为它是由ManyToManyField发送的。

因此,最简单的实现如下:

代码语言:javascript
运行
复制
@receiver(m2m_changed)
def signal_handler(**kwargs):
    from pprint import pprint
    pprint(kwargs)

在本例中,您希望在向组添加用户或从组中删除用户时执行某些操作,以便在action参数接受值'pre_add''post_add''pre_remove''post_remove'时可以利用该参数。您还可以利用pk_set参数,该参数包含已添加到关系或从关系中删除的主键值。

代码语言:javascript
运行
复制
@receiver(m2m_changed)
def signal_handler_when_user_is_added_or_removed_from_group(action, instance, pk_set, model, **kwargs):
    if model == Group:
        if action == 'pre_add':
            # TODO: add logic
            pass
        elif action == 'post_add':
            # TODO: add logic
            pass
        # handle as many actions as one needs
    # The following for loop prints every group that were
    # added/removed.
    for pk in pk_set:
        group = Group.objects.get(id=pk)
        print(group)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7899127

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档