[英]Problem validating modelformset_factory in Django
我在嘗試驗證模型表單時遇到問題,經過各種測試,我認為問題出在 html 模板的信息顯示方式上。
我有 2 個模型:
模型.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")
並通過第三個 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")
要更新 bdComponentes,我結合了兩個 forms
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',
}
然后我打算更新 model
視圖.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
})
我的問題是在我的模板中,前面提到的視圖在我的模板像這樣時完美運行
模板:
<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>
但我需要將我的模板更改為此,因為我添加了一些 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 %}
這個新模板在我看來給了我一個vrComponenteDesForm.is_valid()=False
經過反復試驗,我通過將模板更改為以下方式找到了解決方案:
{{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.