【问题标题】:RelatedObjectDoesNotExist while using custom User model in Django在 Django 中使用自定义用户模型时的 RelatedObjectDoesNotExist
【发布时间】:2016-07-02 17:28:41
【问题描述】:

我有一个帐户应用程序,我在其中通过扩展自定义用户模型创建了一个配置文件模型。我创建了一个视图,允许用户编辑他的个人资料信息,并且我有相应的 UserEditForm 和 ProfileEditForm。截至目前,没有用户拥有个人资料,因此当我打开编辑表单时出现错误:“RelatedObjectDoesNotExist at /account/edit/”。 “用户没有个人资料” 我尝试使用 admin 创建配置文件,然后错误消失。如何在我的 views.py 文件中更正此问题。

views.py

@login_required
def edit(request):
    if request.method =='POST':
        user_form = UserEditForm(instance=request.user,data=request.POST)

        profile_form =     ProfileEditForm(instance=request.user.profile,data=request.POST,files=request.FILES)

        if user_form.is_valid() and profile_form.is_valid():
            user_form.save()
            profile_form.save()
            messages.success(request,'Profile updated successfully')

        else:
            messages.error(request,'Error updating your profile')

    else:
        user_form = UserEditForm(instance=request.user)

        profile_form = ProfileEditForm(instance=request.user.profile)


    context = {
        'user_form':user_form,
        'profile_form': profile_form
    }
    return render(request,'account/edit.html',context)

models.py

CATEGORY_CHOICES = (
    ('SA','School Admin'),
    ('T','Teacher'),
    ('S','Student'),
    ('P','Parent'),
)


class Profile(models.Model):
    eduser = models.OneToOneField(settings.AUTH_USER_MODEL)
    photo = models.ImageField(upload_to='users/%Y/%m/%d',blank=True)
    about_me = models.TextField(max_length=200,blank=True)
    category = models.CharField(max_length=1,choices=CATEGORY_CHOICES,blank=True)
    date_of_birth = models.DateField(blank=True,null=True)

    def __str__(self):
        return 'Profile for user {}'.format(self.eduser.username)

forms.py

class UserEditForm(forms.ModelForm):
    class Meta:
        model = User
        fields = ('first_name','last_name','email')

class ProfileEditForm(forms.ModelForm):

    class Meta:
        model = Profile
        fields = ('category','date_of_birth','about_me','photo')

【问题讨论】:

    标签: django


    【解决方案1】:

    您需要捕获错误。您可以在函数顶部执行此操作:

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

    并将 profile 传递到两个 if 分支的 ProfileEditForm 中。

    【讨论】:

      猜你喜欢
      • 2018-07-26
      • 2013-02-13
      • 2014-01-04
      • 2014-02-07
      • 2015-06-18
      • 1970-01-01
      • 1970-01-01
      • 2013-03-21
      • 1970-01-01
      相关资源
      最近更新 更多