简体   繁体   English

在 Django 中验证 modelformset_factory 时出现问题

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM