[英]Problem validating modelformset_factory in Django
I have a problem trying to validate a modelform and, after various tests, I think the problem is with the html template in how the information is displayed.我在尝试验证模型表单时遇到问题,经过各种测试,我认为问题出在 html 模板的信息显示方式上。
I have 2 models:我有 2 个模型:
models.py:模型.py:
class bdAccesorios(models.Model):
fdClienteAcc=models.CharField(max_length=35)
fdProveedorAcc=models.CharField(max_length=60)
fdSkuAcc=models.CharField(max_length=30)
fdNombreAcc=models.CharField(max_length=60)
fdCostoAcc=models.DecimalField(max_digits=8, decimal_places=2)
fdUnidadAcc=models.CharField(max_length=30)
fdExistenciaAcc=models.IntegerField()
fdAuxAcc=models.CharField(max_length=60, default="0")
class bdComponentes(models.Model):
fdGrupoComp=models.CharField(max_length=30)
fdNombreComp=models.CharField(max_length=60)
fdSkuComp=models.CharField(max_length=30)
fdExistenciaComp=models.DecimalField(max_digits=8, decimal_places=2)
fdDesgloseComp=models.ManyToManyField(bdAccesorios, through="bdComponentesDesglose")
fdPertenenciaComp=models.ForeignKey(bdUsuariosAux , on_delete=models.CASCADE)
fdAuxComp=models.CharField(max_length=60, default="0")
and establish a many to many relationship through a third model to并通过第三个 model 建立多对多关系
class bdComponentesDesglose(models.Model):
fdAccesorioCompDes=models.ForeignKey(bdAccesorios, on_delete=models.CASCADE)
fdComponenteCompDes=models.ForeignKey(bdComponentes, on_delete=models.CASCADE)
fdCantidadCompDes=models.IntegerField(default=1)
fdPrecioTotalAcc=models.DecimalField(max_digits=8, decimal_places=2, blank="true",
editable="false")
To update bdComponentes I combine two forms要更新 bdComponentes,我结合了两个 forms
forms.py: forms.py:
class fmComponente(ModelForm):
class Meta:
model=bdComponentes
fields='__all__'
exclude = ('fdAuxComp', 'fdDesgloseComp')
labels = {
'fdGrupoComp': 'Grupo',
'fdSkuComp': 'SKU',
'fdNombreComp': 'Nombre',
'fdPertenenciaComp': 'Cliente',
'fdExistenciaComp': 'Existencia',
}
class fmComponenteDes(ModelForm):
class Meta:
model=bdComponentesDesglose
fields='__all__'
exclude = ('fdComponenteCompDes','fdPrecioTotalAcc',)
labels = {
'fdAccesorioCompDes': 'Accesorio',
'fdCantidadCompDes': 'Cantidad',
}
Then I make a view to update the model然后我打算更新 model
views.py:视图.py:
def vwComponenteModificar(request,IDComp):
vrModificarComp = bdComponentes.objects.get(id=IDComp)
vrModificarCompDes = bdComponentesDesglose.objects.filter(fdComponenteCompDes__fdNombreComp=vrModificarComp.fdNombreComp)
vrComponenteForm=fmComponente(instance=vrModificarComp)
vrComponenteDesModelForm = modelformset_factory(bdComponentesDesglose, extra=0, exclude = ('fdComponenteCompDes','fdPrecioTotalAcc',))
vrComponenteDesForm=vrComponenteDesModelForm(queryset=vrModificarCompDes)
if request.method == "POST":
vrComponenteForm = fmComponente(request.POST, instance=vrModificarComp)
vrComponenteDesForm=vrComponenteDesModelForm(request.POST)
if vrComponenteForm.is_valid() and vrComponenteDesForm.is_valid(): ###Here is the problem
vrComponenteForm.save()
for lpCompDes in vrComponenteDesForm:
lpCompDes.save()
return redirect('/')
return render(request,"Myapp/ComponentesCrear.html",{
'dtCrearComp': vrComponenteForm,
'dtCrearCompDes': vrComponenteDesForm
})
My problem is in my template the view, previously mention, works perfectly when my template is like this我的问题是在我的模板中,前面提到的视图在我的模板像这样时完美运行
template:模板:
<form action="" method="post">
{% csrf_token %}
<table>
{{ dtCrearComp.management_form}}
{{dtCrearComp}}
<div class="">
{{dtCrearCompDes.management_form}}
{{dtCrearCompDes}}
</div>
</table>
<input type="submit" name="Terminar" value="Terminar">
</form>
But i need to change my template to this, because I added some javascript logic to add buttons that add formset fields dynamically但我需要将我的模板更改为此,因为我添加了一些 javascript 逻辑来添加动态添加表单集字段的按钮
<form class="" method="POST" action="">
{% csrf_token %}
<div class="">
{{dtCrearComp.management_form}}
<table>
{{dtCrearComp}}
<table>
</div>
{{dtCrearCompDes.management_form}}
{% for lpCrearCompDes in dtCrearCompDes %}
<div class="row form-row spacer">
<label>{{lpCrearCompDes.fdAccesorioCompDes.label}}</label>
{{lpCrearCompDes.fdAccesorioCompDes}}
<label>{{lpCrearCompDes.fdCantidadCompDes.label}}</label>
{{lpCrearCompDes.fdCantidadCompDes}}
<button class="btn btn-success add-form-row">+</button>
</div>
{% endfor %}
And this new template gives me in my view a vrComponenteDesForm.is_valid()=False这个新模板在我看来给了我一个vrComponenteDesForm.is_valid()=False
After some trial and error, I found the solution by changing the template to this:经过反复试验,我通过将模板更改为以下方式找到了解决方案:
{{dtCrearCompDes.management_form}}
{% for lpCrearCompDes in dtCrearCompDes %}
<div class="row form-row spacer">
{{lpCrearCompDes.as_p}}
<button class="btn btn-success add-form-row">+</button>
</div>
{% endfor %}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.