键“(User_id)=(51)”已存在

时间:2019-05-13 14:06:50

标签: django

错误:重复记录违反了单一约束“ 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中,用户可以在更新配置文件之前进行注册。当我添加配置文件更新代码时,现在用户无法注册。我该如何解决这个问题?

2 个答案:

答案 0 :(得分:0)

只需为同一OtherInfo不创建两次User

  • 在保存post_save的{​​{1}}处理程序中,您为用户创建了一个User对象。
  • 在您看来,您首先创建了OtherInfo,因此您已经创建了与用户相关联的User
  • 然后您有OtherInfo

最后一条指令将失败,因为您正试图为同一OtherInfo.objects.create(user=new_user,phone=phone,location=location, profile_image=profile_image)创建第二个OtherInfo。因此,您可以做两件事:

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

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

答案 1 :(得分:-1)

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

您得到的错误与数据库有关,您要创建的ID条目已经存在。

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