将默认组分配给新用户Django

将默认组分配给新用户Django,django,Django,我正在尝试为每个注册到系统中的新用户分配一个组。我已经在另一个问题中读到了一些关于它的内容,但我真的不知道在哪里添加必要的代码以使其工作。 我使用的是Django 2.1.3,我使用allauth(社交登录,但在用户表中创建新实例时不会有任何区别)您可以使用@post\u save信号,例如,每次创建用户时,都会将给定组添加到用户的组中。信号通常位于应用程序的信号目录中名为handlers.py的文件中,因此您可能应该创建或修改粗体列出的文件: app/ signals/

我正在尝试为每个注册到系统中的新用户分配一个组。我已经在另一个问题中读到了一些关于它的内容,但我真的不知道在哪里添加必要的代码以使其工作。

我使用的是Django 2.1.3,我使用allauth(社交登录,但在用户表中创建新实例时不会有任何区别)

您可以使用
@post\u save
信号,例如,每次创建
用户
时,都会将给定组添加到
用户
的组中。信号通常位于
应用程序
信号
目录中名为
handlers.py
的文件中,因此您可能应该创建或修改粗体列出的文件:

app/
    signals/
        __init__.py
        handlers.py
    __init__.py
    apps.py
    ...
其中
group\u name
是要添加的组的名称

然后,您应该在您的
MyAppConfig
中导入
handlers.py
模块(如果尚未构建此类配置,请创建一个):

并在
应用程序的
初始化.py
中注册
MyAppConfig

# app/__init__.py

default_app_config = 'app.apps.MyAppConfig'

如果任何新的
用户
实例发生这种情况,您可以将处理程序连接到
post\u save
信号:

from django.db.models.signals import post_save
from django.dispatch import receiver

@receiver(post_save, sender=User)
def handle_new_job(sender, **kwargs):
    if kwargs.get('created', False):
        user = kwargs.get('instance')
        g = Group.objects.get(name='whatever')
        user.groups.add(g)

将此代码包括在应用程序中,并确保按照说明导入,例如:)这只是一个全面、可靠和漂亮的答案。您可以添加
created
检查以避免一些不必要的工作。文档建议使用
settings.AUTH\u USER\u MODEL
而不是
django.contrib.AUTH.models.USER
来获取信号@HåkenLid如果您希望您的应用程序在其他可能具有自定义用户模型的项目中可重用,那么这一点尤其正确。否则,您可以直接使用用户模型。您还可以使用
get_user_model()
函数。@HåkenLid:是的,但我还不确定
post_save
是否是
ModelSignal
,因为如果不是,它就不能真正以
发送方的身份处理
str
。但事实上,它可以。@WillemVanOnsem我也有同样的问题,我喜欢你的解决方案,我想实现它,但在我的例子中,我使用表继承,我想根据用户类型将一个用户分配给一个组。因此,如果用户是代理,他将被分配到“代理”组,依此类推。我该如何实现呢?这也是一个解释得很好、简洁的答案,所以+1:)当
created==True
时不应该发生这种情况吗?@HåkenLid是的,确实如此。我刚刚提供了
False
作为
dict.get
方法的默认值,以便在
kwargs
中由于某种原因可能缺少创建的
时使其更加健壮。您可以将其更改为
True
,以便在将组添加到现有组时出错,而不是在将其添加到新组时出错。我将其误读为
kwargs.get('created')==False
。也就是说,我相信实例和创建的参数总是传递给poståsave信号处理程序。@HåkenLid是的,它应该始终存在。这只是我的一个编码习惯。尽可能明确,假设你的同事对你了解得太多:)
# app/__init__.py

default_app_config = 'app.apps.MyAppConfig'
from django.db.models.signals import post_save
from django.dispatch import receiver

@receiver(post_save, sender=User)
def handle_new_job(sender, **kwargs):
    if kwargs.get('created', False):
        user = kwargs.get('instance')
        g = Group.objects.get(name='whatever')
        user.groups.add(g)