【问题标题】:Django / duplicate key value violates unique constraintDjango / 重复键值违反唯一约束
【发布时间】:2018-03-14 01:09:47
【问题描述】:

我尝试使用 OneToOneField 扩展 django auth 用户模型,但无法解决此问题。

重复键值违反唯一约束“users_profile_user_id_key” 详细信息:密钥 (user_id)=(67) 已存在。

我看了一下这个问题,有人说数据库不同步。

views.py

def create_profile(request):
if request.method == 'POST':
    user_form = UserRegistrationForm(request.POST)
    profile_form = UserProfileForm(request.POST)
    if user_form.is_valid() and profile_form.is_valid():
        registration = user_form.save()
        profile = profile_form.save(commit=False)
        profile.user = registration
        profile.save()
        return redirect('index')
else:
    user_form = UserRegistrationForm()
    profile_form = UserProfileForm()

return render(request, 'registration/registration.html', 
                                            {'user_form': user_form, 
                                            'profile_form': profile_form})

models.py

class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    user_image = models.ImageField(upload_to="blog/assets",
                               default="blog/assets/people-photo.jpg",
                               null=True)
    birth_date = models.DateField(null=True, blank=True)


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

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

forms.py

class UserRegistrationForm(forms.ModelForm):

    class Meta:
        model = User
        fields = ('first_name', 'last_name', 'email', 'username', 'password')
        widgets = {
            'password': forms.PasswordInput(),
        }

class UserProfileForm(forms.ModelForm):

    class Meta:
        model = Profile
        fields = ('user_image', 'birth_date',)

【问题讨论】:

    标签: python django views django-users


    【解决方案1】:

    您最麻烦的是:您尝试两次创建个人资料: 通过信号和形式。 也许您可以删除信号。

    或者尝试使用get_or_create 而不是简单的create,因为我可以看到它不会破坏您的逻辑

    def create_user_profile(sender, instance, created, **kwargs):
        if created:
            Profile.objects.get_or_create(user=instance)
            #              ^^^^^^^^^^^^^^
    

    并覆盖保存表单:

    if user_form.is_valid() and profile_form.is_valid():
        registration = user_form.save()
        # Set user password
        registration.set_password(user_form.cleaned_data.get('password'))
        profile_form = UserProfileForm(request.POST, instance=registration.profile)
        if profileis_valid():
            profile.save()
    

    【讨论】:

    • 非常感谢。你能给我一些关于 django 学习的建议吗? ,
    • 很高兴为您提供帮助,看这里django info
    • 我现在想通了。我可以创建用户但无法使用它登录。你能看到我逻辑上的问题吗?我用 shell_plus 检查了用表单创建的用户密码没有密码哈希。
    • 添加了set_password
    猜你喜欢
    • 2016-06-12
    • 2016-11-27
    • 2012-12-31
    • 1970-01-01
    • 2011-06-26
    • 2012-06-20
    • 2019-09-22
    • 2018-08-26
    相关资源
    最近更新 更多