django - 当我更新任何字段时,我的用户模型在管理面板中将“电子邮件”更改为用户名
问题描述
我的用户模型有问题。交易是,当我更新管理面板中的任何一个或多个字段时,我的电子邮件字段会获得与用户名字段相同的数据。
我不知道如何解决这个问题。所以,我真的很依赖你的帮助。
以下是我所有可能很重要的文件:
模型.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中使用
解决方案
好的,这是对问题的全部解释
第一的:
我不应该使用
AbstractBaseUser
我的方式。我不应该将诸如image、about_me、country和其他字段放入中AbstractBaseUser
,因为当您将其复杂化时,会出现很多意想不到的后果,这些后果专门针对该模型而发生,而其他模型则不会发生。第二:
我应该创建一个连接到的用户配置文件模型,以使其对
AbstractBaseUser
我的 Web 应用程序尽可能简单
我希望这篇文章能帮助你解决你的问题。如果是这样,请为其他人投票
推荐阅读
- python - 如何从数字列表中创建数字符号列表/数组
- spring-batch - 在插入弹簧批处理之前删除记录
- angular - Ngxs - 调用 Angular 服务:好的做法?
- javascript - Typescript 中具有 Null 和 Nullable 对象声明的联合类型之间的区别
- docker - 在 docker 中运行 Gatling 测试
- ruby-on-rails - 如何接受精确的浮点值
- python - 传递给优化器的意外关键字参数:amsgrad
- visual-studio - 如何捕获立即崩溃的 Azure 函数的控制台输出?
- java - Spring“cacheNames”不适用于“key”
- docker - 在 docker 挂载卷中管理 nginx vhost 文件权限