【问题标题】:Problem validating modelformset_factory in Django在 Django 中验证 modelformset_factory 的问题
【发布时间】:2021-01-26 18:49:19
【问题描述】:

我在尝试验证模型表单时遇到问题,经过各种测试,我认为问题在于 html 模板的信息显示方式。

我有 2 个模型:

models.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")

并通过第三种模型建立多对多关系

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.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',
        }

然后我做一个视图来更新模型

views.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

【问题讨论】:

    标签: python django web-applications


    【解决方案1】:

    经过反复试验,我找到了解决方案,将模板更改为:

    {{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 %}
    

    【讨论】:

      猜你喜欢
      • 2014-01-20
      • 2011-08-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-14
      • 2019-06-19
      • 2011-07-03
      • 2023-04-05
      相关资源
      最近更新 更多