我的 View 中有两个表单,当我点击保存时它无法正常工作,当我想在我的模板上显示我保存的内容时没有按预期显示。
这是我所拥有的:
views.py
def index(request):
queryset = Personinfo.objects.all()
queryset2 = Person.objects.all()
qs = chain(queryset,queryset2)
form = personform(request.POST or None)
form2 = personinfoform(request.POST or None)
context = {
"queryset": queryset,
"queryset2": queryset2,
"qs": qs,
"form2":form2,
"form":form,
}
form2_valid = form2.is_valid()
form_valid = form.is_valid()
if form2_valid and form_valid:
a = form2.save()
b= form.save(commit=False)
b.ForeignkeytoA = a
b.save()
return render(request, "index.html", context)
index.html
<form method="POST" action="">{% csrf_token %}
{{form2.as_p}}
{{form.as_p}}
<input type="submit" value="Save!" />
</form>
<table >
<tr>
<th>Name</th>
<th>Address</th>
<th>Number</th>
<th>Hobbies</th>
</tr>
{% for item in qs %}
<tr>
<td>{{ item.name }}</td> #form2
<td>{{ item.address }}</td> #form1
<td>{{ item.phone_number }}</td> #form1
<td>{{ item.address }}</td> #form1
</tr>
{% endfor %}
</table>
模型.py
class Personinfo(models.Model):
name = models.CharField(max_length=128)
def __str__(self):
return self.name
class Person(models.Model):
person = models.ForeignKey(Personinfo)
address = models.TextField()
phone_number = models.CharField(max_length=128)
hobbies =models.CharField(max_length=128)
def __str__(self):
return self.person
我的输出:
如您所见,我的表格没有按预期显示我的项目。 是否有可能在同一行中显示所有项目?
请您参考如下方法:
存在两个错误。如果我理解正确的话,您期望来自 Person 实例的数据和来自其随附的 PersonInfo 实例的数据打印在同一行上。但是,您正在尝试通过使用 chain 来实现此目的,这不是根据它们的关系加入查询集,而是盲目地连接它们。
所以如果 Person.objects.all() 返回一个包含以下数据的查询集
id person address phone_number hobbies
1 1 a a a
2 2 5 5 5
和PersonInfo.objects.all()返回一个包含
id Name
1 aaa
2 aa
chain 将它们组合为
id person name address phone_number hobbies
1 aaa
2 aa
1 1 a a a
2 2 5 5 5
相反,您应该利用模型之间的关系。如果您只将 Person 查询集作为上下文传递给您的模板,您可以编写
{% for p in persons %}
<tr>
<td>{{ p.person.name }}</td>
<td>{{ p.address }}</td>
<td>{{ p.phone_number }}</td>
<td>{{ p.hobbies }}</td>
</tr>
{% endfor %}
--
此外,您在保存表单时错误地设置了 Personinfo 相关实例。通过使用 b.ForeignkeytoA,您正在创建一个新变量作为对象 b 的成员,称为 ForeignkeytoA,它与 Personinfo 关系。要设置相关的Personinfo,您应该引用外键字段的名称person。要更正此问题,该段应该是
# ...
b = form.save(commit = False)
b.person = a
b.save()
# ...
