Как сохранить несколько форм и клонированные формы в django?

views.py

@login_required
def add_product(request):
   productform = ProductForm()
   variantsform = VariantsForm()
   productvariantsform = ProductVariantsForm()
     if request.method == 'POST':
       productform = ProductForm(request.POST, request.FILES)
       variantsform = VariantsForm(request.POST, request.FILES)
       productvariantsform = ProductVariantsForm(request.POST, request.FILES)

       if productform.is_valid():
           product = productform.save(commit=False) 
           vendor = CustomUser.objects.filter(id=request.user.id)
           print(vendor)
           product.vendor = vendor[0]
           product.slug = slugify(product.product_name)
           product.save() 
       if variantsform.is_valid():
           variantsform.save() #finally save

       if productvariantsform.is_valid():
          productvariantsform.save() #finally save
          return redirect('vendor:vendor-admin')
       else:
          return HttpResponse("Nothing submitted...")
    else:
        productform = ProductForm
        variantsform = VariantsForm()
        productvariantsform = ProductVariantsForm()
    return render(request, 'vendor/add_product.html',
            {'productform': productform, 'variantsform':variantsform, 'productvariantsform': productvariantsform})

add_product.html

<div class="container mt-5" id="p"> 
<h1 class="title">Add Product</h1>
<div class="card" style="width: 38rem;">
<form method="POST" action="{% url 'vendor:add-product' %}" enctype="multipart/form-data">
    
  {% csrf_token %}

  <div class="row">
    <div class="col-lg-12 col-md-12">
      {{ productform.vendorid|as_crispy_field }}
    </div>
    <div class="col-lg-12 col-md-12">
      <a id="vendor_id_search" class="btn btn-info mt-4">search</a>
    </div>
  </div>      
  <div id="show_vendorname">

  </div><br>

  {{ productform.maincategory|as_crispy_field }}
  {{ productform.productcategory|as_crispy_field }}
  {{ productform.subcategory|as_crispy_field }}
  {{ productform.product_name|as_crispy_field }}
  {{ productform.brand_name |as_crispy_field }}

  <br>
  <div>
    <p></p>
  </div>
  <hr>

  <div id="order-details-booking">
    
    <div class="row">
      <div class="form-holder">
        <div class="col">
          <h1>Variant Form</h1>
          {{ variantsform.variant_type|as_crispy_field}}
          {{ variantsform.variant_value|as_crispy_field}}        
          {{ productvariantsform.price|as_crispy_field}} 
          {{ productvariantsform.initial_stock|as_crispy_field}}
          {{ productvariantsform.weight_of_product|as_crispy_field}} 

        
          <div class="input-group mb-3">
            <label class="input-group-text" for="upload_file">Upload Images</label>
            <input type="file" id="upload_file" onchange="preview_image();" multiple class="form-control">
          </div>
          <div id="image_preview"></div>
          {% comment %} {{ productvariantsform.images|as_crispy_field}}  {% endcomment %}
          {{ variantsform.sleeve|as_crispy_field }}
          {{ variantsform.material|as_crispy_field }}
          {{ variantsform.neck|as_crispy_field }}
          <div class="col s1">
            <a class="btn btn-outline-danger remove">- remove this</a>
          </div>
        </div>
      </div>     
    </div>

    <div class="form-holder-append"></div>
    <div class="row">
      <div class="col-xs-4">
        <a class="btn btn-outline-success add">+ add more variants</a>
      </div>
    </div>
  </div><br>

  <hr>

  <div class="field mt-4">
    <div class="control">
      <button type="submit" class="button is-dark is-uppercase">Add Product</button>
    </div>
  </div>
</form>
 <script>    
     // Cloning Form
     var id_count = 1;
     $('.add').on('click', function() {
     var source = $('.form-holder:first'), clone = source.clone();
     clone.find(':input').attr('id', function(i, val) {
       return val + id_count;
     });
     clone.appendTo('.form-holder-append');
      id_count++;
      });

    // Removing Form Field
     $('body').on('click', '.remove', function() {
       var closest = $(this).closest('.form-holder').remove();
    });

  </script>

У меня есть сомнения по поводу сохранения различных типов форм. У меня есть 3 формы. форма продукта, форма вариантов из, форма вариантов продукта.

В шаблоне я показал. Здесь я клонировал одну форму, которая имеет смешанные поля из variantsform и productvariantsform.

В views.py я пытался сохранить каждую форму отдельно методом django if form.is_valid() form.save(), но это не помогло. Нужно руководство, чтобы обработать это соответствующим образом в views.py.

Вернуться на верх