Django:如何更新User的扩展模型中的特定字段?

时间:2017-07-30 07:54:14

标签: python django

我对Django比较陌生,我坚持这个。我一直在尝试创建一个网站,用户可以在其中创建帐户,查看他们和其他成员的个人资料页面。

models.py

class UserProfileInfo(models.Model):
    """docstring for ClassName"""
    user = models.OneToOneField(User)
    status = models.TextField(blank = True)
    desc = models.TextField(blank = True)
    portfolio_site = models.URLField(blank = True)
    profilepic = models.ImageField(blank = True, null = True, upload_to = 'profile_pics') 
    def __str__(self):
        return self.user.username

forms.py

class UserForm(forms.ModelForm):
    password = forms.CharField(widget =  forms.PasswordInput())

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

class UserProfileInfoForm(forms.ModelForm):
    class Meta():
        model = UserProfileInfo
        fields = ('desc', 'portfolio_site', 'status', 'profilepic')

因此,我希望用户能够通过在文本框中输入来从主页更新其状态。

index.html(用户可以更新其状态的主页)

   

 <form method="POST" action="{% url 'app5:user_status' user.username %}">
    {% csrf_token %}
    <div class="form-group">
          <label for="inputlg"></label>
          <input class="form-control input-lg" id="inputlg" type="text" name='status' placeholder="How are you feeling?">
        </div><center>
        <input type="submit" name='submitbtn' value='Add Status'>
        </center>
    </form>

以下是我在views.py中更新状态的函数:

def user_status(request, username):

    if request.method == 'POST':
        mystatus = request.POST.get('status')
        user = User.objects.get(username=username)
        user.userprofileinfo.status = mystatus
        user.save()
        return redirect('app5:profilepage', username=username)

然而,它不起作用。如果我尝试更新其他字段,例如用户模型中的用户名或电子邮件而不是UserProfileInfo扩展模型,则user.email = mystatus适用于该情况。但是当我尝试更新UserProfileInfo模型的状态字段时,不会发生更新。我很确定该行中存在错误:user.userprofileinfo.status= mystatus。我在文档和许多其他来源中搜索过,但一直无法找到答案。我该怎么做呢?

非常感谢任何帮助。谢谢!

编辑:点击“提交”后,我没有收到任何错误。只是更新不会发生在模型中,状态字段保持不变。

2 个答案:

答案 0 :(得分:2)

您保存了用户,而不是userprofileinfo对象。它是一个单独的模型,因此需要单独保存。

profile = user.userprofileinfo
profile.status = mystatus
profile.save()

答案 1 :(得分:2)

如果您在UserProfileInfo中有更新字段,则获取UserProfileInfo的对象并更新该字段,如下所示

def user_status(request,username):

    if request.method == 'POST':
         mystatus = request.POST.get('status')
         user = User.objects.get(username=username)
         userprofileinfo = user.userprofileinfo
         userprofileinfo.status = mystatus
         userprofileinfo.save()
         return redirect('app5:profilepage',username=username)