我创建了一个信号,可以做三件事:
使用信号,步骤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_name
和last_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...
答案 0 :(得分:0)
如果只想向默认用户模型添加一些字段,则不应从抽象用户那里继承。最好使用一对一字段使用相关模型
我的建议是删除自定义类。并在您的个人资料和auth.User模型之间添加关系。
答案 1 :(得分:0)
假设:
groups
中列出的users/admin.py
模块中有Permission fieldset
使用post_save
信号将用户添加到组中时
post_save
信号将用户添加到组(将用户添加到组并保存到数据库)一个快速修复方法是:从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'
}),