我正在尝试在User(AbstractBaseUser)-model和内置的Group-model之间添加ForeignKey。我现在的问题是我无法创建超级用户,因为它需要用“东西”填充组字段。
我已经通过shell创建了一个组,名为admin,ID为1.但是,我找不到创建超级用户的方法,并在创建时将组设置为admin ..
以下是我/ accounts app中的 models.py :
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.
答案 0 :(得分:1)
遇到同样的问题。
实际上,group
是PermissionsMixin
的归因,因此您需要做的是实施PermissionsMixin
和AbstractBaseUser
class User(AbstractBaseUser, PermissionsMixin):
答案 1 :(得分:0)
你可以改变
group = group
到
group = Group.objects.get(id=group)
在你的create_superuser def中。
然后您可以使用超级用户向导所期望的组ID(在您的情况下为1)。
如果您最终使用多个实例,我会考虑在迁移中而不是通过shell创建该组(因此当您设置新实例并运行迁移时它将自动存在) 。