【问题标题】:The key "(User_id) = (51)" already exists键“(User_id) = (51)”已经存在
【发布时间】:2019-05-13 14:06:50
【问题描述】:

错误:重复记录违反了单数约束“user_otherinfo_user_id_key” 详情:键“(user_id) = (52)”已经存在。

models.py


        class OtherInfo(models.Model):

            user = models.OneToOneField(User,on_delete=models.CASCADE)
            phone = models.CharField(max_length=11,verbose_name="phone number")
            location = models.CharField(max_length=50,verbose_name="location")
            profile_image = models.FileField(blank = True,null = True,verbose_name="image")


        class Meta:
            verbose_name_plural = 'Other informations'

            @receiver(post_save, sender=User)
            def create_user_profile(sender, instance, created, **kwargs):
                if created:
                    OtherInfo.objects.create(user=instance)

            @receiver(post_save, sender=User)
            def save_user_profile(sender, instance, **kwargs):
                instance.otherinfo.save()

forms.py

class LoginForm(forms.Form):
    username = forms.CharField(label = "Username")
    password = forms.CharField(label = "Parola",widget = forms.PasswordInput)

class RegisterForm(forms.ModelForm):
    password1 = forms.CharField(max_length=100, label='Parola',widget=forms.PasswordInput())
    password2 = forms.CharField(max_length=100, label='Parola again', widget=forms.PasswordInput())
    phone_number = forms.CharField(required=False, max_length=11, label='Phone Number')
    location = forms.CharField(required=False, max_length=50, label='Location')
    profile_image = forms.FileField(required=False, label="Image") 

class Meta:
    model = User

    fields = [
        'first_name',
        'last_name',
        'email',
        'username',
        'password1',
        'password2',
        'phone_number',
        'location',
        'profile_image',
    ]

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 do not match!")
    return password2

class UserForm(forms.ModelForm):
    class Meta:
        model = User
        fields = ('first_name', 'last_name', 'email')

class ProfileForm(forms.ModelForm):
    class Meta:
        model = OtherInfo
        fields = ('phone', 'location', 'profile_image')

views.py

@login_required
@transaction.atomic
def updateprofile(request):
    if request.method == 'POST':
        user_form = UserForm(request.POST, instance=request.user)
        profile_form = ProfileForm(request.POST, instance=request.user.otherinfo)
        if user_form.is_valid() and profile_form.is_valid():
            user_form.save()
            profile_form.save()
            messages.success(request, _('Your profile has been successfully updated!'))
            return redirect('/user/profile/')
        else:
            messages.error(request, _('Please correct the following error.'))
    else:
        user_form = UserForm(instance=request.user)
        profile_form = ProfileForm(instance=request.user.otherinfo)
    return render(request, 'user/update_user.html', {
        'user_form': user_form,
        'profile_form': profile_form
    })

def register(request):

    form = RegisterForm(request.POST or None,request.FILES or None )
    if form.is_valid():
        user = form.save(commit=False)
        first_name = form.cleaned_data.get('first_name')
        last_name = form.cleaned_data.get('last_name')
        username = form.cleaned_data.get("username")
        email = form.cleaned_data.get('email')
        password = form.cleaned_data.get('password1')
        phone = form.cleaned_data.get('phone_number')
        location = form.cleaned_data.get('location')
        profile_image = form.cleaned_data.get('profile_image')
        user.set_password(password)

        user.save()
        new_user = authenticate(username=user.username, first_name=first_name, last_name=last_name, email=email, password=password)

OtherInfo.objects.create(user=new_user,phone=phone,location=location,
profile_image=profile_image)

        login(request,new_user)
        messages.info(request,"Successfully Register ...")

        return redirect("/")
    context = {
            "form" : form
        }
    return render(request,"user/register.html",context)

在 Django 中,用户可以在更新配置文件之前注册。当我添加配置文件更新代码时,现在用户无法注册。我该如何解决这个问题?

【问题讨论】:

    标签: django


    【解决方案1】:

    这只是不为同一个User 创建两次OtherInfo 的问题:

    • 在保存Userpost_save 处理程序中,您为用户创建了一个OtherInfo 对象。
    • 在您看来,您首先创建了User,因此您已经创建了与用户关联的OtherInfo
    • 那么你有OtherInfo.objects.create(user=new_user,phone=phone,location=location, profile_image=profile_image)

    最后一条指令将失败,因为您正尝试为同一 user 创建第二个 OtherInfo。所以你可以做两件事:

    1. 删除创建OtherInfo 对象的post_save 信号处理程序

    1. 通过设置各种值并保存而不是创建它来更新new_user.otherinfo

    【讨论】:

    • 删除构成 OtherInfo 对象的 post_save 信号处理程序时,用户会给出更新错误。我做错了什么?
    • 那是因为当用户被保存时,你有第二个post_save 信号保存OtherInfo。我真的不认为需要它,您也可以删除它。或者至少在尝试保存之前检查代码if hasattr(instance, 'otherinfo')
    • 你说的是我的 Models.py 文件,对吧?我尝试了所有这些可能性,但我做不到。
    • 是的,移除模型中的两个信号接收器。它们不是必需的。
    • 错误;用户不允许更新用户,控制台或浏览器中没有错误文本。一切都运行良好,但没有更新。
    【解决方案2】:

    您需要删除 id=51 的数据条目。

    您得到的错误与数据库有关,您尝试创建的具有 id 的条目已经存在。

    删除您的数据库并创建一个新数据库(如果您不在生产环境中)

    【讨论】:

    • 我使用的是postgresql数据库。
    • 你必须在 PostgreSQL 内部进行
    • 实际上,我的数据库中没有记录。单击保存按钮在数据库中创建一条记录,但浏览器返回错误。
    猜你喜欢
    • 2015-03-01
    • 2018-07-31
    • 1970-01-01
    • 1970-01-01
    • 2012-06-15
    • 2016-10-29
    • 1970-01-01
    • 2021-02-04
    • 2013-01-06
    相关资源
    最近更新 更多