【问题标题】:Adding user to group on creation in Django在 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。
  • 不是说有区别,而是你为什么要覆盖发件人?

标签: python django django-models django-authentication


【解决方案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

【讨论】:

    猜你喜欢
    • 2018-12-14
    • 2019-01-04
    • 1970-01-01
    • 2011-09-11
    • 2015-06-30
    • 2012-05-21
    • 2020-07-16
    • 2017-05-25
    • 1970-01-01
    相关资源
    最近更新 更多