在 Django 中创建时将用户添加到组
Posted
技术标签:
【中文标题】在 Django 中创建时将用户添加到组【英文标题】:Adding user to group on creation in Django 【发布时间】:2014-10-21 19:13:46 【问题描述】:只有在创建用户后将此用户的字段指定为“真”时,我才希望将用户添加到组中。创建的每个用户都会有一个与之关联的“用户配置文件”。这会是实现这种事情的正确方法吗?
models.py:
def add_group(sender, instance, created, **kwargs):
if created:
sender = UserProfile
if sender.is_in_group:
from django.contrib.auth.models import Group
g = Group.objects.get(name='Some Group')
g.user_set.add(sender)
post_save.connect(add_group, sender=UserProfile)
提前致谢!
【问题讨论】:
您应该注册 User,而不是 UserProfile 的 post_save。 不是说有区别,而是你为什么要覆盖发件人? 【参考方案1】:另一种选择是使用post_save
信号
from django.db.models.signals import post_save
from django.contrib.auth.models import User, Group
def add_user_to_public_group(sender, instance, created, **kwargs):
"""Post-create user signal that adds the user to everyone group."""
try:
if created:
instance.groups.add(Group.objects.get(pk=settings.PUBLIC_GROUP_ID))
except Group.DoesNotExist:
pass
post_save.connect(add_user_to_public_group, sender=User)
唯一的麻烦是如果你使用一个夹具......(因此是 DoesNotExists ..)
【讨论】:
我更喜欢使用post_save
信号,但在将用户添加到组之前,我需要能够检查此布尔字段是否标记为真。我的UserProfile
模型与“用户”有OneToOneField
关系,并且是在保存新的User
时创建的,所以我认为sender
应该是UserProfile
。显然,我错了,这很好,但我仍然需要能够在将“用户”添加到组之前执行检查。
使用装饰器将是 from django.dispatch import receiver
@receiver(post_save, sender=User)
def add_user_to_public_group(sender, instance, created, **kwargs):
而不是使用 post_save.connect(add_user_to_public_group, sender=User)
【参考方案2】:
试试这个:
def save(self, *args, **kwargs):
# `save` method of your `User` model
# if user hasnt ID - is creationg operation
created = self.id is None
super(YourModel, self).save(*args, **kwargs)
# after save user has ID
# add user to group only after creating
if created:
# adding to group here
【讨论】:
以上是关于在 Django 中创建时将用户添加到组的主要内容,如果未能解决你的问题,请参考以下文章