在Django admin中,我有时会在(现有)组中添加或删除用户。当这种情况发生时,我希望能够运行一个函数。
我只是使用标准的用户和组模型。
我已经考虑过通过m2m_changed用信号来做这件事,但它似乎需要一个直通类--我不认为在这种情况下有一个直通类。
发布于 2011-11-24 18:57:22
发送器-描述ManyToManyField的中间模型类。这个类是在定义多对多字段时自动创建的;您可以使用多对多字段上的through属性来访问它。
订阅m2m_changed时,如下所示:
@receiver(m2m_changed)
def my_receiver(**kwargs):
from pprint import pprint
pprint(kwargs)
你会收到一堆这样的信号(缩写):
{'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_clear
、post_clear
、pre_add
、post_add
。使用这些信号的组合,您可以存储pre和post组。通过对这些列表进行比较,您可以获得用户的已删除组和已添加组。
请注意,当编辑组而不是用户时,信号是相反的(pk_set
和instance
)。
发布于 2018-06-26 06:01:49
您将在Django documentation (v1.11)中看到,所需的发送方应该是属于ManyToMany
字段的中间through
字段,无论该字段是在何处定义的。如果你将它注册为你的发送者,那么你将会听到例如用户向他们自己添加组,以及组向他们自己添加用户。
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
发布于 2018-04-11 04:39:01
您需要使用m2m_changed
作为接收器来创建信号。根据the official Django documentation的说法
当模型实例上的
ManyToManyField
发生更改时,将发送信号。严格地说,这不是一个模型信号,因为它是由ManyToManyField
发送的。
因此,最简单的实现如下:
@receiver(m2m_changed)
def signal_handler(**kwargs):
from pprint import pprint
pprint(kwargs)
在本例中,您希望在向组添加用户或从组中删除用户时执行某些操作,以便在action
参数接受值'pre_add'
、'post_add'
、'pre_remove'
和'post_remove'
时可以利用该参数。您还可以利用pk_set
参数,该参数包含已添加到关系或从关系中删除的主键值。
@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)
https://stackoverflow.com/questions/7899127
复制相似问题