django admin一对一内联保存数据

时间:2018-07-23 05:57:07

标签: python django django-admin

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

0 个答案:

没有答案