【问题标题】:RelatedObjectDoesNotExist at /profile/profile 处的 RelatedObjectDoesNotExist
【发布时间】:2018-02-27 16:26:44
【问题描述】:

我已经创建了用户配置文件模型。我迁移了模型以与数据库同步。但是,当我路由到/profile (whose url is this url(r'^profile$', views.update_profile, name="profile"),) 时,我收到User has no profile 的错误,它应该调用update_profile 视图,在检查它是否为POST 方法之前,我已经打印了request 对象,但它也没有显示在贝壳。我哪里做错了?

这是我的代码

class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    bio = models.TextField(max_length=600, blank=True)
    location = models.CharField(max_length=30, blank=True)
    birth_date = models.DateField(blank=True, null=True)


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


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


class UserForm(forms.ModelForm):

    class Meta:
        model = User
        fields = ('first_name', 'last_name', 'email')


class ProfileForm(forms.ModelForm):

    class Meta:
        model = Profile
        exclude = ('user', )


def update_profile(request):
    print('user ################', request.user, request.user.profile)
    if request.method == 'POST':
        user_form = UserForm(request.POST, instance=request.user)
        profile_form = ProfileForm(
            request.POST or None, instance=request.user.profile)
        if user_form.is_valid() and profile_form.is_valid():
            user_form.save()
            profile_form.save()
            messages.success(
                request, ('your profile was successfully updated!'))
            return redirect('products:profile')
        else:
            messages.error(
                request, ('There was an error updating your profile'))
    else:
        user_form = UserForm(instance=request.user)
        profile_form = ProfileForm(instance=request.user.profile)
    return render(request, 'dashboard/company/profile.html', {'user_form': user_form, 'profile_form': profile_form})

【问题讨论】:

    标签: python django python-3.x django-models django-forms


    【解决方案1】:

    抱歉,我在发布问题后才找到结果。如果我需要删除问题,我一定会删除它,否则这里是解决方案

    def update_profile(request):
        try:
            profile = request.user.profile
        except Profile.DoesNotExist:
            profile = Profile(user=request.user)
        if request.method == 'POST':
            user_form = UserForm(request.POST, instance=request.user)
            profile_form = ProfileForm(
                request.POST or None, instance=profile)
            if user_form.is_valid() and profile_form.is_valid():
                user_form.save()
                profile_form.save()
                messages.success(
                    request, ('your profile was successfully updated!'))
                return redirect('products:profile')
            else:
                messages.error(
                    request, ('There was an error updating your profile'))
        else:
            user_form = UserForm(instance=request.user)
            profile_form = ProfileForm(instance=request.user.profile)
        return render(request, 'dashboard/company/profile.html', {'user_form': user_form, 'profile_form': profile_form})
    

    上面代码中更新的部分是

    try:
            profile = request.user.profile
        except Profile.DoesNotExist:
            profile = Profile(user=request.user)
    

    我无法清楚地解释,但查看错误,配置文件中的 RelatedObjectDoesNotexist 给了我一个检查 request.user.profile 是否存在的想法,所以我尝试了这种方式,它对我有用。如果有人对此很了解,请随时详细解释。

    【讨论】:

      【解决方案2】:

      你可以用更少的代码来写,比如,

      def update_profile(request):
          profile = Profile.objects.get_or_create(user=request.user)
          if request.method == 'POST':
              user_form = UserForm(request.POST, instance=request.user)
              profile_form = ProfileForm(
                  request.POST or None, instance=profile)
              if user_form.is_valid() and profile_form.is_valid():
                  user_form.save()
                  profile_form.save()
                  messages.success(
                      request, ('your profile was successfully updated!'))
                  return redirect('products:profile')
              else:
                  messages.error(
                      request, ('There was an error updating your profile'))
          else:
              user_form = UserForm(instance=request.user)
              profile_form = ProfileForm(instance=profile)
          return render(request, 'dashboard/company/profile.html', {'user_form': user_form, 'profile_form': profile_form})
      

      【讨论】:

        猜你喜欢
        • 2020-12-06
        • 2020-09-03
        • 2018-03-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-07-25
        • 2015-01-19
        • 1970-01-01
        相关资源
        最近更新 更多