Django отправка взаимосвязанных форм

107
05 мая 2021, 22:10

В моем тренировочном проекте на django есть страница с следующим сценарием: Форма для добавления типа изделия (модель Type_of_product, поля формы model, department_id), плюс кнопка, которая добавляет произвольное количество форм для описания возможных характеристик изделия(модель Characteristic_of_product, поля формы label, units, description).
Предполагается, что при нажатии "Сохранить", в модели Type_of_product создается запись, и на основе ее ключа произвольное количество записей в Characteristic_of_product
Модели:

class Type_of_product(models.Model):
    model = models.CharField(max_length=255)
    department_id = models.ForeignKey('Department', on_delete=models.DO_NOTHING)
class Characteristic_of_product(models.Model):
    label = models.CharField(max_length=255)
    type_of_product_id = models.ForeignKey('Type_of_product', on_delete=models.DO_NOTHING)
    units = models.CharField(max_length=255)
    description = models.TextField()


Вьюшки:

def type_product_add_form(request):
    if request.method == 'POST':
        form = TypeProductAdd(request.POST)
        department_id_v = request.POST.get("department")
        if form.is_valid():
            add_type = Type_of_product.objects.create(model=form.cleaned_data['label'],
                                                      department_id_id=department_id_v)
            add_type.save()
            request.session['Type_of_product_id'] = add_type.id
    else:
        form = TypeProductAdd()
    return render(request, 'type_product_add_from.html', {'form': form})

def characteristics_of_product_add_form(request):
    if request.method == 'POST':
        form = CharacteristicAdd(request.POST)
        type_of_product_id = request.session.get("Type_of_product_id")
        if form.is_valid():
            add_char = Characteristic_of_product.objects.create(label=form.cleaned_data['label'], type_of_product_id_id=type_of_product_id, units=form.cleaned_data['units'], description=form.cleaned_data['description'])
            add_char.save()
            return redirect(type_product_add_form)
    else:
        form = CharacteristicAdd()
    return render(request, 'characteristics_of_product_add_form.html', {'form': form})


код страницы добавления изделия:

{% extends "base.html" %} 
 
{% block content %} 
<h1>Форма добавления нового типа изделия</h1> 
    <form id="type_product_add" method="post"> 
        {% csrf_token %} 
        <table> 
        {{ form }} 
        </table> 
    </form> 
    <div id="content"></div> 
        <input class="btn btn-default" id="btn_add" type="button" value="Добавить характеристику"> 
    <script> 
        $(document).ready(function(){ 
 
            $('#btn_add').click(function(){ 
                $.ajax({ 
                    type: "GET", 
                    url: "char/", 
                    cache: false, 
                    success: function(html){ 
                        $("#content").append(html); 
                    } 
                }); 
            }); 
            $('#btn_submit').click(function(){ 
                 var type_product = document.getElementById('type_product_add'); 
                 var content = document.getElementById('content'); 
                 var elements = content.querySelectorAll('form'); 
                 type_product.submit(); 
                 console.log(type_product); 
                   for (var i = 0; i < elements.length; i++) { 
                       var f = elements[i]; 
                       f.submit(); 
                       console.log(f); 
                   } 
            }); 
         }); 
    </script> 
        <input id="btn_submit" class="btn btn-default" type="submit" value="Сохранить"> 
{% endblock %}


код формы характеристики:

    <form action="{% url 'characteristics_of_product_add_form' %}" method="post"> 
        {% csrf_token %} 
        <table> 
        {{ form }} 
        </table> 
    </form>

Данное исполнение приводит к тому, что формы обрабатываются в неправильном порядке и по этому страница либо вылетает с ошибкой либо записывает ID типа изделия от предыдущей сессии. Подскажите, пожалуйста, как заставить обрабатываться формы в нужном мне порядке. Подозреваю кейс довольно стандартный, но к сожалению это ближайшее решения, которое я смог реализовать. Возможно есть принципиально другое решения задачи.

READ ALSO
Перенос статичного сайта на react

Перенос статичного сайта на react

ПроблемаЕсть сайт с кучей разных html, в каждой jq скрипты, на главной странице просто ссылки на другие страницы, в общем полный адъ

71
Ошибка при отправке формы

Ошибка при отправке формы

код работы с формой:

100