Django 1.10自定义用户'is_superuser'与模型中的字段'is_superuser'相冲突 [英] Django 1.10 custom User 'is_superuser' clashes with the field 'is_superuser' from model

查看:411
本文介绍了Django 1.10自定义用户'is_superuser'与模型中的字段'is_superuser'相冲突的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在 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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆