首页 > 解决方案 > 当我更新任何字段时,我的用户模型在管理面板中将“电子邮件”更改为用户名

问题描述

我的用户模型有问题。交易是,当我更新管理面板中的任何一个或多个字段时,我的电子邮件字段会获得与用户名字段相同的数据。

我不知道如何解决这个问题。所以,我真的很依赖你的帮助。

以下是我所有可能很重要的文件:

模型.py

class User(AbstractBaseUser):
    email = models.EmailField(
        verbose_name = 'email address',
        max_length=255,
        unique=True
        )
    real_name = models.CharField(max_length=20, blank=True)
    username = models.CharField(max_length=40, unique=True, verbose_name='username')
    active = models.BooleanField(default=True)
    staff = models.BooleanField(default=False)
    admin = models.BooleanField(default=False)
    grade = models.ForeignKey(GradeUser, on_delete=models.CASCADE, blank=True, null=True)
    country = models.ForeignKey(Country, on_delete=models.CASCADE, blank=True, null=True)
    reputation = models.IntegerField(default=0)
    image = models.ImageField(upload_to='accounts/media', blank=True)
    about_me = models.TextField(blank=True)


    USERNAME_FIELD= 'email'
    REQUIRED_FIELDS = ['username']
    objects = UserManager()

    def get_email(self):
        return self.email

    def get_username(self):
        return self.username

    def __str__(self):
        return self.email

    def has_perm(self, perm, obj=None):
        return True

    def has_module_perms(self, app_label):
        return True

    @property
    def is_staff(self):
        return self.staff

    @property
    def is_admin(self):
        return self.admin

    @property
    def is_active(self):
    return self.active

我的表格.py

class UserAdminCreationForm(forms.ModelForm):
password1 = forms.CharField(label='Password', widget=forms.PasswordInput)
password2 = forms.CharField(label='Password confirmation', widget=forms.PasswordInput)

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

def clean_password2(self):
    password1 = self.cleaned_data.get("password1")
    password2 = self.cleaned_data.get("password2")
    if password1 and password2 and password1 != password2:
        raise forms.ValidationError("Passwords don't match")
    return password2

def save(self, commit=True):
    user = super(UserAdminCreationForm, self).save(commit=False)
    user.set_password(self.cleaned_data["password1"])
    user.active = False
    if commit:
        user.save()
    return user

class UserAdminChangeForm(forms.ModelForm):
    password = ReadOnlyPasswordHashField()
    class Meta:
        model = User
        fields = ('email', 'username', 'password', 'active', 'admin')

    def clean_password(self):
        return self.initial["password"]

PS:这两种形式在admin.py中使用

标签: djangodjango-modelsdjango-forms

解决方案


好的,这是对问题的全部解释

  1. 第一的:

    我不应该使用AbstractBaseUser我的方式。我不应该将诸如imageabout_mecountry其他字段放入中AbstractBaseUser,因为当您将其复杂化时,会出现很多意想不到的后果,这些后果专门针对该模型而发生,而其他模型则不会发生。

  2. 第二:

    我应该创建一个连接到的用户配置文件模型,以使其AbstractBaseUser我的 Web 应用程序尽可能简单

我希望这篇文章能帮助你解决你的问题。如果是这样,请为其他人投票


推荐阅读