Django 1.11自定义用户模型与组

时间:2017-09-19 12:28:44

标签: python django

我正在尝试在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.

2 个答案:

答案 0 :(得分:1)

遇到同样的问题。

实际上,groupPermissionsMixin的归因,因此您需要做的是实施PermissionsMixinAbstractBaseUser

class User(AbstractBaseUser, PermissionsMixin):

答案 1 :(得分:0)

你可以改变

group = group

group = Group.objects.get(id=group)

在你的create_superuser def中。

然后您可以使用超级用户向导所期望的组ID(在您的情况下为1)。

如果您最终使用多个实例,我会考虑在迁移中而不是通过shell创建该组(因此当您设置新实例并运行迁移时它将自动存在) 。