Python Django-在一个视图中提交多个表单
我的视图中有两个窗体,当我点击save时,它不能正常工作;当我想在模板上显示我保存的内容时,它没有按预期显示 以下是我所拥有的: 视图.pyPython Django-在一个视图中提交多个表单,python,django,Python,Django,我的视图中有两个窗体,当我点击save时,它不能正常工作;当我想在模板上显示我保存的内容时,它没有按预期显示 以下是我所拥有的: 视图.py def index(request): queryset = Personinfo.objects.all() queryset2 = Person.objects.all() qs = chain(queryset,queryset2) form = personform(request.POST or None)
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)
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
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>
我的输出:
正如您所看到的,我的表没有按预期显示我的项目。
是否有可能在同一行中显示每个项目?存在两个错误。如果我理解正确,您希望来自
Person
实例的数据和来自其附带的PersonInfo
实例的数据打印在同一行上。然而,您正试图通过使用来实现这一点,这不是基于它们的关系来连接查询集,而是盲目地连接它们
因此,如果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
queryset作为上下文传递给模板,则可以编写
{% 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 %}
{{p.person.name}
不为我工作,我试着只传递person
正如你所建议的,除了name
Try{p.person.id}
之外,一切都正常,看看它是否打印了一个id。b.ForeignkeytoA=a
是用你的代码写的吗?这将在python对象b
下设置一个名为ForeignkeytoA
的新变量,而不是将person
外键设置为对象a
。它应该是b.person=a
。那么ForeignkeytoA
呢?你的意思是b.save()下的b.person=a
?
# ...
b = form.save(commit = False)
b.person = a
b.save()
# ...