Django 1.10自定义用户'is_superuser'与模型中的字段'is_superuser'相冲突 [英] Django 1.10 custom User 'is_superuser' clashes with the field 'is_superuser' from model
问题描述
我在 models.py
中编写了一个自定义用户类- CustomUser
,主要跟在此处
从django.conf导入
从django.db导入设置
从django.utils导入模型
。翻译从django.core.mail导入ugettext_lazy as _ _
从django.core导入send_mail
导入验证器从django.contrib.auth.models导入
import(AbstractUser,PermissionsMixin,
UserManager )
类CustomUser(AbstractUser,PermissionsMixin):
自定义用户,请参考以下示例
https://github.com/ jonathanchu / django-custom-user-example / blob / master / customuser / accounts / models.py
用户名= models.CharField(_('用户名'),max_length = 30,唯一=真的,
help_text = _(’为必填。少于30个字符。字母,数字和'
'@/./+/-/_字符'),
验证者= [validators.RegexValidator(
re.compile('^ [\w。@ +-] + $'),_('输入有效的用户名。'),'无效')
])
email = models.EmailField(_('email address'),max_length = 254 )
create_time = models.DateTimeField(auto_now_add = True)
active = models.BooleanField()#如果我们可以从
对象外部检索它= UserManager()
USERNAME_FIELD ='用户名'
类Meta:
verbose_name = _('用户')
verbose_name_plural = _('用户')
def email_user(自己,主题,消息,from_email =无):
向该用户发送电子邮件。
send_mail(主题, message,from_email,[self.email])
def __str __(self):
return self.username
然后我在 admin.py
<$ p中注册了它从django.contrib导入$ p>
从django.contrib.auth.admin导入admin
从.models导入UserAdmin
导入CustomUser
#注册模型这里。
类CustomUserAdmin(UserAdmin):
模型= CustomUser
admin.site.register(CustomUser,CustomUserAdmin)
但是当我运行 python manage.py createsuperuser
创建超级用户时,我出现以下错误:
错误:
myapp.CustomUser.is_superuser:(models.E006)字段'is_superuser '将
与模型'myapp.customuser'中的字段'is_superuser'冲突。
is_superuser
字段在 PermissionMixin
上定义。但是, AbstractUser
还会将 PermissionMixin
子类化,因此您实际上是两次从同一个类继承。这会导致字段冲突,因为旧版本的Django不允许子类覆盖字段(最新版本允许覆盖抽象基类上定义的字段)。
您要么继承自 AbstractBaseUser
和 PermissionMixin
,要么继承自 AbstractUser
。 AbstractUser
定义了一些其他字段,包括用户名
, is_staff
和 is_active
等。
I write a custom user class - CustomUser
in models.py
, mainly followed here
import re
from django.conf import settings
from django.db import models
from django.utils.translation import ugettext_lazy as _
from django.core.mail import send_mail
from django.core import validators
from django.contrib.auth.models import (AbstractUser, PermissionsMixin,
UserManager)
class CustomUser(AbstractUser, PermissionsMixin):
"""
custom user, reference below example
https://github.com/jonathanchu/django-custom-user-example/blob/master/customuser/accounts/models.py
"""
username = models.CharField(_('username'), max_length=30, unique=True,
help_text=_('Required. 30 characters or fewer. Letters, numbers and '
'@/./+/-/_ characters'),
validators=[validators.RegexValidator(
re.compile('^[\w.@+-]+$'), _('Enter a valid username.'), 'invalid')
])
email = models.EmailField(_('email address'), max_length=254)
create_time = models.DateTimeField(auto_now_add=True)
active = models.BooleanField() # if we can retrieval it from outside
objects = UserManager()
USERNAME_FIELD = 'username'
class Meta:
verbose_name = _('user')
verbose_name_plural = _('users')
def email_user(self, subject, message, from_email=None):
"""
Sends an email to this User.
"""
send_mail(subject, message, from_email, [self.email])
def __str__(self):
return self.username
Then I registered it in admin.py
from django.contrib import admin
from django.contrib.auth.admin import UserAdmin
from .models import CustomUser
# Register your models here.
class CustomUserAdmin(UserAdmin):
model = CustomUser
admin.site.register(CustomUser, CustomUserAdmin)
But when I run python manage.py createsuperuser
to create a superuser, I got the following error:
ERRORS:
myapp.CustomUser.is_superuser: (models.E006) The field 'is_superuser' clash
es with the field 'is_superuser' from model 'myapp.customuser'.
The is_superuser
field is defined on PermissionMixin
. However, AbstractUser
also subclasses PermissionMixin
, so you're effectively inheriting from the same class twice. This causes the field clash, as older versions of Django don't allow subclasses to override fields (recent versions allow to override fields that are defined on abstract base classes).
You either have to inherit from AbstractBaseUser
and PermissionMixin
, or from just AbstractUser
. AbstractUser
defines some additional fields, including username
, is_staff
and is_active
, and some other things.
这篇关于Django 1.10自定义用户'is_superuser'与模型中的字段'is_superuser'相冲突的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!