回答此问题可获得 20 贡献值,回答如果被采纳可获得 50 分。
<p>我正在制作一个跟踪不同电话公司所有者的系统,让用户添加所有者的姓名。我希望用户能够一次添加几个所有者,并且,为了避免大量的RegEx、Ajax和Node,我在数据库中创建了5个“所有者”表(我知道这是意大利面条代码的缩影)。最后4个所有者表具有null=True和blank=True,因此它们是可选的。在UI中显示时,我将所有者的每个表单字段表示放在自己的div中,并隐藏最后4个div。用户可以通过单击按钮选择“添加其他所有者”,最多可添加4个额外所有者。很少所有五个div都被填写,因此其中一些始终被基本javascript隐藏。然后,我继续使用.save()和其他模型一样保存它们。当用户填写完所有需要的字段并点击“提交”时,一切正常,但是。。。数据永远不会被发送到数据库</p>
<p>我在任何地方都没有错误,这导致我猜测在保存数据时传递的表单无效。我知道问题出在“几个隐藏的表单”部分,因为我的系统在只有一个所有者表而没有任何隐藏的情况下工作得很好。然而,由于它没有给我任何错误消息,我现在不知所措,我不知道为什么它认为我的表单无效</p>
<p>注意:我意识到django的方法是创建表单集来添加一个表的多个实例,但是在表单集中创建这些动态和隐藏,比如说,5个表单中的4个表单,并在单击按钮时显示其余的表单,或者使用循环实现真正的动态表单行为,这是非常具有挑战性的,我没有javascript/react知识来做到这一点。隐藏表单并在用户请求时显示表单的能力非常重要-我知道,如果不这样做,只需使用表单集而不隐藏任何内容,就可以轻松解决此问题</p>
<p>编辑:
我尝试了一些方法来修复它,例如在表单名称和.save()之间添加.instance,设置instance=(我正在编辑其实例的表单),然后设置commit=False,最后在保存时设置commit=True。我生成的新“实例”变量为灰色,没有显示“未使用局部变量“实例”值”的消息</p>
<p>我在models.py文件中发现一个错误:在PhoneCompany中,所有者集应该是一个外键,但实际上是作为一个ManyToManyField写入的。当我更正它时,它返回以下错误:django.db.utils.IntegrityYerror:非空约束失败:new_uPhoneBook\u companyinformation.owner\u集\u id
我想这并不奇怪;因为数据从未保存到数据库中,所以没有创建所有者集,因此也没有可引用的所有者集</p>
<p>my models.py文件:</p>
<pre><code>from django.db import models
Owner1(models.Model):
owner1_name = models.CharField(max_length=200)
Owner2(models.Model):
owner2_name = models.CharField(max_length=200)
Owner3(models.Model):
owner3_name = models.CharField(max_length=200)
Owner4(models.Model):
owner4_name = models.CharField(max_length=200)
Owner5(models.Model):
owner5_name = models.CharField(max_length=200)
OwnerSet(models.Model):
owner1 = models.ForeignKey(Owner1, on_delete=models.CASCADE, default=None)
owner2 = models.ForeignKey(Owner2, on_delete=models.CASCADE, default=None)
owner3 = models.ForeignKey(Owner3, on_delete=models.CASCADE, default=None)
owner4 = models.ForeignKey(Owner4, on_delete=models.CASCADE, default=None)
owner5 = models.ForeignKey(Owner5, on_delete=models.CASCADE, default=None)
PhoneCompany(models.Model):
name = models.CharField(max_length = 400, default=None)
address = models.CharField(max_length = 400, default=None)
owner_set = models.ForeignKey(OwnerSet, on_delete=models.CASCADE, default=None)
</code></pre>
<p>my forms.py文件:</p>
<pre><code>from django.forms import ModelForm
from django import forms
from .models import *
class Form1(ModelForm):
class Meta:
model = Owner1
fields = ['owner1_name']
widgets = {
'owner1_name': TextInput(attrs={'class': 'form-control', 'id': 'owner1'})}
class Form2(ModelForm):
class Meta:
model = Owner2
fields = ['owner2_name']
widgets = {
'owner2_name': TextInput(attrs={'class': 'form-control', 'id': 'owner2'})}
class Form3(ModelForm):
class Meta:
model = Owner3
fields = ['owner3_name']
widgets = {
'owner3_name': TextInput(attrs={'class': 'form-control', 'id': 'owner3'})}
class Form4(ModelForm):
class Meta:
model = Owner4
fields = ['owner4_name']
widgets = {
'owner4_name': TextInput(attrs={'class': 'form-control', 'id': 'owner4'})}
class Form5(ModelForm):
class Meta:
model = Owner5
fields = ['owner5_name']
widgets = {
'owner5_name': TextInput(attrs={'class': 'form-control', 'id': 'owner5'})}
class Form6(ModelForm):
class Meta:
model = OwnerSet
fields = ['owner1_name']
# because i needed at least one to make the code run and it didn't like like '__all__'
widgets = {
'owner1_name': iTextInput(attrs={'class': 'form-control', 'id': 'fk_owner1'})}
class Form7(ModelForm):
class Meta:
model = PhoneCompany
fields = ['name', 'address']
widgets = {
'name': TextInput(attrs={'class': 'form-control', 'id': 'comp_name'})
'address': TextInput(attrs={'class': 'form-control', 'id': 'adrs'})
}
</code></pre>
<p>my views.py文件:</p>
<pre><code>from django.shortcuts import render, redirect
from .forms import *
def company_input(request):
form1 = Form1()
form2 = Form2()
form3 = Form3()
form4 = Form4()
form5 = Form5()
form6 = Form6()
form7 = Form7()
if request.method == 'POST':
form_owner1 = Form1(request.POST)
form_owner2 = Form2(request.POST)
form_owner3 = Form3(request.POST)
form_owner4 = Form4(request.POST)
form_owner5 = Form5(request.POST)
form_ownerset = Form6(request.POST)
form_company = Form7(request.POST)
if form_owner1.is_valid() and form_owner2.is_valid() and
form_owner3.is_valid() and form_owner4.is_valid() and
form_owner5.is_valid() and form_ownerset.is_valid() and
form_company.is_valid():
owner1 = form_owner1.save()
owner2 = form_owner2.save()
owner3 = form_owner3.save()
owner4 = form_owner4.save()
owner5 = form_owner5.save()
instance = form_ownerset.save(commit=False) # greys out
instance.owner1 = owner1
instance.owner2 = owner2
instance.owner3 = owner3
instance.owner4 = owner4
instance.owner5 = owner5
ownerset = instance.save(commit=True)
instance = form_company.save(commit=False) # greys out
instance.ownerset = ownerset
company = instance.save()
else:
print("Error: a form is not valid.") # never returns the error...
context = {'from1': form1,
'form2': form2,
'form3': form3,
'form4': form4,
'form5': form5,
'form6': form6,
'form7': form7,
}
return render(request, 'phoneBook/reg_owners.html', context)
</code></pre>
<p>my reg_owners.html文件:</p>
<pre><code> <div id="owners" class="column">
<div id="owner1">
<h5>Owner 1:</h5>
<br>
{{ form1.as_p }}
</div>
<div id="masterdiv">
<button id="btn1" style="width: 90px; margin-left: 40px" >Add Owner</button>
<div id="own2" style="display: none; margin-left: 40px; border-radius: 6px;">
<p>{{ form2.as_p }}</p>
</div>
<br>
<button id="btn2" style="margin-left: 40px; display: none">Add Owner</button>
<div id="own3" style="display: none; margin-left: 40px; border-radius: 6px;">
<p>{{ form3.as_p }}</p>
</div>
<br>
<button id="btn3" style="margin-left: 40px; display: none">Add Owner</button>
<div id="own4" style="display: none; margin-left: 40px; border-radius: 6px;">
<p>{{ form4.as_p }}</p>
</div>
<br>
<button id="btn4" style="margin-left: 40px; display: none">Add Owner</button>
<div id="own5" style="display: none; margin-left: 40px; border-radius: 6px;">
<p>{{ form5.as_p }}</p>
</div>
</div>
</code></pre>
<p>我的add_owner.js文件:</p>
<pre><code>const btn1 = document.getElementById("btn1")
const btn2 = document.getElementById("btn2")
const btn3 = document.getElementById("btn3")
const btn4 = document.getElementById("btn4")
# own1 is not included, because the first owner form is required and never changes or hides
const own2 = document.getElementById("own2")
const own3 = document.getElementById("own3")
const own4 = document.getElementById("own4")
const own5 = document.getElementById("own5")
btn1.onclick = function(e){
e.preventDefault();
if(btn1.innerHTML === "Add Owner"){
btn1.innerHTML = "Remove";
if(btn2.style.display === "none" && own2.style.display === "none"){
btn2.style.display = "block";
own2.style.display = "block";
}
else if (btn2.style.display === "block" && own2.style.display === "block"){
btn2.style.display = "none";
own2.style.display = "none";
}
}
/*close the div*/
else{
btn1.innerHTML = "Add Owner"
if(own2.style.display === "block" && btn2.style.display === "block"){
own2.style.display = "none"
btn2.style.display = "none"
}
}
}
btn2.onclick = function(e){
e.preventDefault();
if(btn2.innerHTML === "Add Owner"){
btn2.innerHTML = "Remove";
btn1.disabled = true
/*Display button 3 and owner 3*/
if(btn3.style.display === "none" && own3.style.display === "none"){
btn3.style.display = "block";
own3.style.display = "block";
} /*hide button 3 and owner 3*/
else if (btn3.style.display === "block" && own3.style.display === "block"){
btn3.style.display = "none";
own3.style.display = "none";
}
}
/*close the div*/
else{
btn2.innerHTML = "Add Owner"
if(own3.style.display === "block" && btn3.style.display === "block"){
own3.style.display = "none"
btn3.style.display = "none"
btn1.disabled = false
}
}
}
btn3.onclick = function(e){
e.preventDefault();
if(btn3.innerHTML === "Add Owner"){
btn3.innerHTML = "Remove";
btn2.disabled = true
/*Display button 3 and owner 3*/
if(btn4.style.display === "none" && own4.style.display === "none"){
btn4.style.display = "block";
own4.style.display = "block";
} /*hide button 3 and owner 3*/
else if (btn4.style.display === "block" && own4.style.display === "block"){
btn4.style.display = "none";
own4.style.display = "none";
}
}
/*close the div*/
else{
btn3.innerHTML = "Add Owner"
if(own4.style.display === "block" && btn4.style.display === "block"){
own4.style.display = "none"
btn4.style.display = "none"
btn2.disabled = false
}
}
}
btn4.onclick = function(e){
e.preventDefault();
if(btn4.innerHTML === "Add Owner"){
btn4.innerHTML = "Remove";
btn3.disabled = true
if(own5.style.display === "none"){
own5.style.display = "block";
} /*hide button 3 and author 3*/
else if (own5.style.display === "block"){
own5.style.display = "none";
}
}
/*close the div*/
else{
btn4.innerHTML = "Add iOwner"
if(own5.style.display === "block"){
own5.style.display = "none"
btn3.disabled = false
}
}
}
</code></pre>