使用自定义用户模型时缺少组和权限分配
Group and Permissions Assignment Missing when using Custom User Model
我正在构建一个具有通过 Django Groups 定义的多个角色的应用程序。
我从一个自定义用户模型开始,定义如下。
我发现在使用自定义用户模型时使用的组和权限存在奇怪的差异,就像继承缺失了一些东西。
我想使用自定义用户模型,所以我不使用用户名,但我的应用程序中还需要多个组和权限。
from django.db import models
from django.contrib.auth.models import AbstractUser, AbstractBaseUser, BaseUserManager, PermissionsMixin
import random
import string
from slugify import slugify
# Create your models here.
class MyAccountManager(BaseUserManager):
def create_user(self, email, password=None):
if not email:
raise ValueError("You must have an email address")
user = self.model(
email=self.normalize_email(email),
)
user.set_password(password)
user.save(using=self._db)
return user
def create_superuser(self, email, password):
user = self.create_user(
email=self.normalize_email(email),
)
user.set_password(password)
user.is_admin=True
user.is_staff=True
user.is_superuser=True
user.save(using=self._db)
return user
#custom user account model
class User_Account(AbstractUser):
email = models.EmailField(verbose_name='email', max_length=60, unique = True)
date_joined = models.DateTimeField(verbose_name="Date Joined", auto_now_add=True)
last_login = models.DateTimeField(verbose_name="Last Login", auto_now=True)
username = models.CharField(max_length=100, null=True)
is_admin = models.BooleanField(default=False)
is_active = models.BooleanField(default=True)
is_staff = models.BooleanField(default=False)
is_superuser = models.BooleanField(default=False)
USERNAME_FIELD = 'email'
REQUIRED_FIELDS = []
objects = MyAccountManager()
def __str__(self):
return self.email
当我使用自定义用户模型创建新组时,该组会自动分配给所有创建的用户。我以编程方式和通过 Django Admin 重现了这种行为。
当我使用默认用户模型时,组创建不会自动将组分配给所有用户。
我还发现,当使用自定义用户模型时,用户的 Django Admin 是不一样的(组和权限分配字段不完整 - 下面的屏幕截图)
Weird incomplete Django Admin interface with groups and permissions missing the available fields
Normal Django Admin interface with group and permission assignment as expected - default user model
我设法在管理面板中解决了这个问题。看来是Admin错误导致的视觉渲染问题class.
错误是由以下原因引起的:
filter_horizontal = ()
list_filter = ()
fieldsets = ()
实际上我已经在上面的 class 中添加了正确的参数,但忘记注释 out/remove 这些行。注释掉后可以正常工作。
尝试移除
filter_horizontal = (),
对我有用。
我正在构建一个具有通过 Django Groups 定义的多个角色的应用程序。 我从一个自定义用户模型开始,定义如下。
我发现在使用自定义用户模型时使用的组和权限存在奇怪的差异,就像继承缺失了一些东西。
我想使用自定义用户模型,所以我不使用用户名,但我的应用程序中还需要多个组和权限。
from django.db import models
from django.contrib.auth.models import AbstractUser, AbstractBaseUser, BaseUserManager, PermissionsMixin
import random
import string
from slugify import slugify
# Create your models here.
class MyAccountManager(BaseUserManager):
def create_user(self, email, password=None):
if not email:
raise ValueError("You must have an email address")
user = self.model(
email=self.normalize_email(email),
)
user.set_password(password)
user.save(using=self._db)
return user
def create_superuser(self, email, password):
user = self.create_user(
email=self.normalize_email(email),
)
user.set_password(password)
user.is_admin=True
user.is_staff=True
user.is_superuser=True
user.save(using=self._db)
return user
#custom user account model
class User_Account(AbstractUser):
email = models.EmailField(verbose_name='email', max_length=60, unique = True)
date_joined = models.DateTimeField(verbose_name="Date Joined", auto_now_add=True)
last_login = models.DateTimeField(verbose_name="Last Login", auto_now=True)
username = models.CharField(max_length=100, null=True)
is_admin = models.BooleanField(default=False)
is_active = models.BooleanField(default=True)
is_staff = models.BooleanField(default=False)
is_superuser = models.BooleanField(default=False)
USERNAME_FIELD = 'email'
REQUIRED_FIELDS = []
objects = MyAccountManager()
def __str__(self):
return self.email
当我使用自定义用户模型创建新组时,该组会自动分配给所有创建的用户。我以编程方式和通过 Django Admin 重现了这种行为。 当我使用默认用户模型时,组创建不会自动将组分配给所有用户。 我还发现,当使用自定义用户模型时,用户的 Django Admin 是不一样的(组和权限分配字段不完整 - 下面的屏幕截图) Weird incomplete Django Admin interface with groups and permissions missing the available fields
Normal Django Admin interface with group and permission assignment as expected - default user model
我设法在管理面板中解决了这个问题。看来是Admin错误导致的视觉渲染问题class.
错误是由以下原因引起的:
filter_horizontal = ()
list_filter = ()
fieldsets = ()
实际上我已经在上面的 class 中添加了正确的参数,但忘记注释 out/remove 这些行。注释掉后可以正常工作。
尝试移除
filter_horizontal = (),
对我有用。