Python Django/重复键值违反唯一约束

Python Django/重复键值违反唯一约束,python,django,views,django-users,Python,Django,Views,Django Users,我试图用OneToOneField扩展django auth用户模型,但无法解决这个问题 重复的键值违反唯一约束“用户\配置文件\用户\ id \键值” 详细信息:密钥(用户id)=(67)已存在 我看了一下这个问题,有人说数据库不同步 视图.py 型号.py forms.py 您最大的问题是:您试图创建配置文件的时间加倍: 通过信号和形式。 也许你可以去掉这个信号 或者尝试使用get\u或\u create而不是简单的create,因为我可以看到它不会破坏您的逻辑 def create_use

我试图用OneToOneField扩展django auth用户模型,但无法解决这个问题

重复的键值违反唯一约束“用户\配置文件\用户\ id \键值” 详细信息:密钥(用户id)=(67)已存在

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

视图.py

型号.py

forms.py


您最大的问题是:您试图创建配置文件的时间加倍: 通过信号和形式。 也许你可以去掉这个信号

或者尝试使用
get\u或\u 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的学习建议吗,很高兴能帮你,看这里,我现在知道了。我可以创建用户,但不能用它登录。你能看出我逻辑上的问题吗?。我用shell_检查,加上用表单创建的用户密码没有密码散列。添加
set_password
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',)
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()