Django:将用户添加到信号组中

时间:2019-05-29 17:30:06

标签: python django

我创建了一个信号,可以做三件事:

  1. 创建用户
  2. 创建该用户的个人资料
  3. 将用户添加到组

使用信号,步骤1和2可以正常工作,但是我似乎无法将用户添加到组中(步骤3)。

# Signals
@receiver(post_save, sender=User)
def create_user_profile(sender, instance, created, **kwargs):
  if created:
    Profile.objects.create(user=instance)
    group = Group.objects.get(name='generics')
    instance.groups.add(group)

进行了一些调试,发现即使我注释掉Profile.objects.create(user=instance),我仍然无法向instance添加任何组。

我在这里错过了什么吗?我没有任何错误。

编辑1:。这是一个自定义用户模型。

from django.contrib.auth.models import AbstractUser

class User(AbstractUser):
  first_name = None
  last_name = None

  class Meta:
    verbose_name_plural = 'users'

  def __str__(self):
    return self.username

我只是将first_namelast_name移到了Profile表中。正如您所见,没有做任何其他事情。用户和个人资料已成功创建,因此此自定义模型可以正常工作。

尽管没有必要,我在添加组后添加了instance.save(),但仍然无法正常工作。管理员显示尚未添加任何组,并且数据库表core_user_groups仍然为空。

编辑2:添加控制台测试

更奇怪的是,我尝试使用./manage.py shell添加组,并且效果很好。

>>> from core.models import User
>>> from django.contrib.auth.models import Group
>>> group = Group.objects.get(pk=1)
>>> group
<Group: generics>
>>> user = User.objects.get(pk=23)
>>> user
<User: sonic>
>>> user.groups.add(group)

# At this point I check the admin and the db and it worked. Hmmm....but how to do it within a signal...

2 个答案:

答案 0 :(得分:0)

如果只想向默认用户模型添加一些字段,则不应从抽象用户那里继承。最好使用一对一字段使用相关模型

我的建议是删除自定义类。并在您的个人资料和auth.User模型之间添加关系。

答案 1 :(得分:0)

假设:

  • 如果您的项目是从Cookiecutter初始化的,则
  • 您的groups中列出的users/admin.py模块中有Permission fieldset

使用post_save信号将用户添加到组中时

  1. 用户对象已保存
  2. 触发post_save信号将用户添加到组(将用户添加到组并保存到数据库)
  3. 由于您未在管理页面中选择任何组,因此已清除用户组(用户的组信息已清除)

一个快速修复方法是:从admin.py中的groups中删除UserAdmin.fieldsets

@admin.register(User)
class UserListAdmin(BaseUserAdmin):

    fieldsets = (
        (None, {'fields': ('username', 'password')}),
         ...
        (_('Permissions'), {
            'fields': ('is_active', 'is_staff', 'is_superuser'), # 'groups'
        }),