Skip to main content
 首页 » 编程设计

python之Django之在 View 中提交多个表单

2024年10月17日29TianFang

我的 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() 
# ...