我对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
。我在文档和许多其他来源中搜索过,但一直无法找到答案。我该怎么做呢?
非常感谢任何帮助。谢谢!
编辑:点击“提交”后,我没有收到任何错误。只是更新不会发生在模型中,状态字段保持不变。
答案 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)