簡體   English   中英

在 Django 中驗證 modelformset_factory 時出現問題

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM