社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Django

错误:Django管理员用户更改表单将电子邮件替换为用户名

Sam • 5 年前 • 1951 次点击  

我正在处理一个需要自定义用户模型的项目,因此我成功地创建了一个自定义用户模型,但是在管理面板中编辑和保存用户时,出现了一个错误,用户电子邮件被用户名替换。注册时,此问题不显示,但仅在管理员中显示。

class UserAdminChangeForm(UserChangeForm):
    def __init__(self, *args, **kargs):
        super(UserAdminChangeForm, self).__init__(*args, **kargs)

class Meta:
    model = User
    fields = ('email', 'password', 'username', 'is_active', 'is_admin')

class UserManager(BaseUserManager):
    def create_user(self, email, username, password=None, is_active=True, 
    is_admin= False, is_staff = False, is_profiled =False):
    if not email:
        raise ValueError("User must enter an email address.")
    if not password:
        raise ValueError("User must enter a password.")
    if not username:
        raise ValueError("User must enter a username.")
    user_obj = self.model(email= self.normalize_email(email),username = 
    username )
    user_obj.set_password(password)
    user_obj.is_staff = is_staff
    user_obj.is_admin = is_admin
    user_obj.is_active = is_active
    user_obj.profiled = is_profiled
    user_obj.username = username
    user_obj.save(using= self._db)

    return user_obj

    def create_staffuser(self, email, username, password=None):
         user = self.create_user(email,username, password = password, 
         is_staff= True)
        return user

    def create_superuser(self, email, username, password=None, is_active = 
        True):
        user = self.create_user(
        email,
        username,
        password = password,
        is_staff= True, is_admin = True, is_active = True
        )
        user.is_superuser = True
        return user

class User(AbstractBaseUser, PermissionsMixin):
    email = models.EmailField(unique= True)
    is_active = models.BooleanField(default= True)
    is_staff = models.BooleanField(default= False)
    is_admin = models.BooleanField(default= False)
    profiled = models.BooleanField(default= False)
    username = models.CharField(unique= True, blank=True, null = 
    True,max_length= 20)
    #first_name = models.CharField(max_length= 20)
    #updated = models.DateTimeField(auto_now = True)
    timestamp = models.DateTimeField(auto_now_add = True)

    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = ['username']

    objects = UserManager()

admin page screenshot

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/41055
 
1951 次点击  
文章 [ 1 ]  |  最新文章 5 年前
Sam
Reply   •   1 楼
Sam    6 年前
def save(self, *args, **kwargs):
        user = super(UserAdminChangeForm, self).save(*args, **kwargs)
        user.email = self.cleaned_data['email']
        user.username = self.cleaned_data['username']
        return user

必须重写save方法才能修复它。似乎Django因为一些未知的原因而不匹配这两个字段。