我的视图中有两种形式,当我单击保存时,它不能正常工作;当我想在模板上显示保存的内容时,显示的结果与预期不符。
这是我所拥有的:
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>
models.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()
# ...