我的视图中有两种形式,当我单击保存时,它不能正常工作;当我想在模板上显示保存的内容时,显示的结果与预期不符。

这是我所拥有的:

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


我的输出:

python - Django-在 View 中提交多个表单-LMLPHP

如您所见,我的表未按预期显示我的物品。
有没有可能显示同一行中的每个项目?

最佳答案

存在两个错误。如果我理解正确,则您希望来自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()
# ...

07-28 09:46