我在models.py
中有以下课程:
class Profile(models.Model):
.......
class MyUser(AbstractUser):
profile = models.OneToOneField(Profile, null=True, on_delete=models.PROTECT)
......
Admin.py
:
class MyUserInline(admin.StackedInline):
model = MyUser
.........
class MyUserChangeForm(UserChangeForm):
class Meta(UserChangeForm.Meta):
model = MyUser
class MyAdminPasswordChangeForm(AdminPasswordChangeForm):
def save(self, commit=True):
"""
Saves the new password.
"""
password = self.cleaned_data["password1"]
self.user.myuser.set_password(password)
if commit:
self.user.myuser.save()
return self.user.myuser
class ProfileAdmin(UserAdmin):
inlines = (MyUserInline,)
form = MyUserChangeForm
........
在我的情况下,我希望用户的用户名是他的电子邮件,可以通过在save_model
中覆盖ProfileAdmin
并像这样进行保存来轻松完成此操作:
def save_model(self, request, obj, form, change):
saved_user = form.save()
saved_user.myuser.username = saved_user.myuser.email
saved_user.save()
但是问题是当我们插入重复的电子邮件时。 email
字段不是唯一的,但是username
是唯一的,因此Profile
的保存正确,但是saved_user.save()
无法完成其工作(UNIQUE constraint failed: accounts_myuser.username
),但此错误是没有陷入try..catch
中。我相信我应该更改设置用户名的位置,但是O找不到正确的方法。我应该怎么做? tnx