RelatedObjectDoesNotExist 用户没有个人资料。

4

我是一名新手,正在学习Django。我正在使用内置的Django用户模型和Usercreation表单创建用户注册功能。我想扩展Django内置的用户模型以包含额外的公司名称字段。然而,我遇到了以下经常出现的错误,请帮助我解决这个问题:

RelatedObjectDoesNotExist 用户没有档案

(1)这是我的Profile模型的Model.py代码:

class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    Company_name = models.CharField(max_length=30)


@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()

(2.)这是我的views.py文件。我试图在每次创建新的用户实例时更新个人资料模型。似乎我需要将create_user_profile和save_user_profile函数链接到我的视图,但我不太确定如何做到这一点。

def Register(request):
    if request.method == 'POST':
        User_form = RegisterRecruiterForm(request.POST, instance=request.user)
        Profile_form = ProfileForm(request.POST, instance=request.user.profile)
        if User_form.is_valid() and Profile_form. is_valid():
            User_form.save()
            Profile_form.save()
            return HttpResponse('you are now registered')
    else:
        User_form = RegisterRecruiterForm(instance=request.user)
        Profile_form = ProfileForm(instance=request.user.profile)
    return render(request, 'Register.html', {
        'User_form': User_form,
        'Profile_form': Profile_form

        })

3.这是我的forms.py文件。

    class RegisterRecruiterForm(UserCreationForm):

        email = forms.EmailField(max_length=254, help_text='Required. Inform a valid email address.')


    class Meta:
        model = User
        fields = ('username', 'email', 'password1', 'password2')


    def save(self, commit=True):
        user = super(RegisterRecruiterForm, self).save(commit=False)
        user.email(self.cleaned_data["email"])
        user.username(self.cleaned_data["username "])
        user.password(self.cleaned_data["password1 "])
        user.password(self.cleaned_data["password2 "])
        if user.password1 != user.password2:
            raise forms.validationError("Password do not match")
        return Profile.Company_name

        if commit:

                user.save()
        return user


    class ProfileForm(forms.ModelForm):
        Company_name = forms.CharField(max_length=10,help_text='Required')

        class Meta:
            model = Profile
            fields = ('Company_name',)

def save(self, commit=True):
    Profile = super(ProfileForm, self).save(commit=False)
    Profile.Company_name(self.cleaned_data["Company_name"])

    if commit:

            Profile.save()
    return Profile
1个回答

2

我看到您的问题是,您试图在此行中获取“request.user.profile”:

Profile_form = ProfileForm(request.POST, instance=request.user.profile)

在您的模型中,“User”没有“Profile”,但“Profile”有一个“User”,因此获取此配置文件的正确方法是:
profile = Profile.objects.get(user = request.user)
Profile_form = ProfileForm(request.POST, instance = profile)

以下翻译为您解决"RelatedObjectDoesNotExist"错误。如果出现其他错误,请提新问题。

最后,你的"Register"函数将是:

def Register(request):
    if request.method == 'POST':
        User_form = RegisterRecruiterForm(request.POST, instance=request.user)
        profile = Profile.objects.get(user = request.user)
        Profile_form = ProfileForm(request.POST, instance = profile)
        if User_form.is_valid() and Profile_form. is_valid():
            User_form.save()
            Profile_form.save()
            return HttpResponse('you are now registered')
    else:
        User_form = RegisterRecruiterForm(instance=request.user)
        profile = Profile.objects.get(user = request.user)
        Profile_form = ProfileForm(request.POST, instance = profile)
    return render(request, 'Register.html', {
        'User_form': User_form,
        'Profile_form': Profile_form

        })

Nazkter,感谢您的回答,但是您能否请指明我需要在哪里进行更改?profile = Profile.objects.get(user=request.user)(模型) Profile_form = ProfileForm(request.POST, instance=profile)(视图) - John Tomasson
在您的view.py文件中,将“Profile_form = ProfileForm(request.POST, instance=request.user.profile)”这一行替换为我回答中的内容。 - Nazkter
你好,我正在检查我的旧答案,然后到了这里。如果我的答案有效,您能将其设置为正确答案吗? - Nazkter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接