Python Django 1.11带有组的自定义用户模型
我试图在我的用户(AbstractBaseUser)模型和内置组模型之间添加一个ForeignKey。我现在的问题是我无法创建超级用户,因为它需要用“something”填充group字段 我通过shell创建了一个名为admin的组,id为1。但是,我找不到创建超级用户的方法,并在创建时将组设置为admin 以下是my/accounts应用程序中的models.py:Python Django 1.11带有组的自定义用户模型,python,django,Python,Django,我试图在我的用户(AbstractBaseUser)模型和内置组模型之间添加一个ForeignKey。我现在的问题是我无法创建超级用户,因为它需要用“something”填充group字段 我通过shell创建了一个名为admin的组,id为1。但是,我找不到创建超级用户的方法,并在创建时将组设置为admin 以下是my/accounts应用程序中的models.py: from django.db import models from django.forms import ModelForm
from django.db import models
from django.forms import ModelForm
from django.contrib.auth.models import (
BaseUserManager,
AbstractBaseUser,
Group
)
class UserManager(BaseUserManager):
def create_user(self, email, group, password=None):
if not email:
raise ValueError('Users must have an email address')
user = self.model(
email = UserManager.normalize_email(email),
password = password,
group = group
)
user.set_password(password)
user.save()
return user
def create_superuser(self, email, group, password):
user = self.create_user(
email = UserManager.normalize_email(email),
group = group
)
user.is_admin = True
user.is_staff = True
user.is_superuser = True
user.save()
return user
class User(AbstractBaseUser):
objects = UserManager()
date_added = models.DateField(auto_now=False, auto_now_add=True)
email = models.EmailField(unique=True, db_index=True)
group = models.ForeignKey(Group)
USERNAME_FIELD = 'email'
REQUIRED_FIELDS = ['group']
is_active = models.BooleanField(default=True)
is_admin = models.BooleanField(default=False)
def __str__(self):
return self.email
def get_full_name(self):
return self.email
def get_short_name(self):
return self.email
def has_perm(self, perm, obj=None):
return True
def has_perms(self, perm, obj=None):
return True
def has_module_perms(self, app_label):
return True
def is_staff(self):
return self.is_admin
每当我运行migrate.py createsuperuser时,它都会询问电子邮件、密码和组(组ID)。
如果我键入admin
,则会出现以下错误:
ValueError: invalid literal for int() with base 10: 'admin'
如果我键入1(id),则会出现以下错误:
ValueError: Cannot assign "'1'": "User.group" must be a "Group" instance.
你可以改变
group = group
到
在您的创建超级用户定义中
然后,您可以只使用超级用户向导所期望的组id(在您的情况下为1)
如果您最终将使用多个实例,我将考虑在迁移中而不是通过shell创建该组(因此,当您设置新实例并运行迁移时,该组将自动出现) 遇到同样的问题
实际上,group
是PermissionsMixin
的属性,所以您需要做的是实现PermissionsMixin
和AbstractBaseUser
class User(AbstractBaseUser, PermissionsMixin):
我还尝试将
group=group
更改为group=group.objects.get(id=group)
,但这会产生以下错误:TypeError:int()参数必须是字符串、类似对象的字节或数字,而不是“group”
您确定只在def create\u superuser中更改了它吗?查看您在原始帖子的评论中给出的错误,看起来您在create_user和create_superuser上都对其进行了更改。实际上我复制了你的代码,只是改变了那一行,它在这里工作。我做了,是的。还是不走运。我只是从头开始重新检查,它对我有效。如果您仍然有这个问题,那么这是什么python/django版本(也许您也可以在其中共享回购协议?)。
class User(AbstractBaseUser, PermissionsMixin):