@Enter_a_nickname

Почему дубликат формы не сохраняет данные?

В проекте есть страница с формами. Одну из форм необходимо сделать динамической, данный функционал я реализовал с помощью javascript. Добавление данной формы по скрипту происходит корректно, но добавляемая форам не сохраняет данные в бд.
Для реализации динамической формы я использовал данную статью: https://www.brennantymrak.com/articles/django-dyna...

Но т.к. у меня на 1 странице в 1 views обрабатывается сразу несколько форм я исправил код под свой проект.

мой forms.py:
class ColorForms(ModelForm):
    class Meta:
        model = Color
        fields = ['temp', 'correct', 'top', 'bottom']
        widgets = {
            'temp': NumberInput(attrs={
                'class': 'form-control',
                'placeholder': 'temp'
            }),
            'correct': NullBooleanSelect(attrs={
                'class': 'form-control',
                'placeholder': 'correct'
            }),
            'top': NumberInput(attrs={
                'class': 'form-control',
                'placeholder': 'top'
            }),
            'bottom': NumberInput(attrs={
                'class': 'form-control',
                'placeholder': 'bottom'
            }),
        }

    class SpeedsForms(ModelForm):
    class Meta:
        model = Speed
        fields = ['start',  'end']
        widgets = {
            "start": TimeInput(attrs={
                'class': 'form-control',
                'placeholder': "start"
            }),
            "end": TimeInput(attrs={
                'class': 'form-control',
                'placeholder': "end"
            })
        }

    DogFormSet = modelformset_factory(
    Dog, fields=('name', 'number', 'Speed', 'DataTime'), extra=1
)

    class DogRequestsForm(ModelForm):
    class Meta:
        model = DogRequest
        fields = ['id_name', 'Color', 'Dog']
        widgets = {
            'id_name': NumberInput(attrs={
                'class': 'form-control',
                'placeholder': 'id_name'
            }),
            'Color': SelectMultiple(attrs={
                'class': 'form-control',
                'placeholder': 'Color'
            }),
            'Dog': SelectMultiple(attrs={
                'class': 'form-control',
                'placeholder': 'Dog'
            }),
        }


мой views.py:
from .forms import DogFormSet 

    def dog(request):
    formset = DogFormSet (queryset=dog.objects.none())

    if request.method == 'POST' and 'speed' in request.POST:
        form2 = SpeedsForms(request.POST)
        if form2.is_valid():
            form2.save()

    if request.method == 'POST' and 'dogs' in request.POST:
        formset = DogFormSet(request.POST)
        if formset.is_valid():
            formset.save()

    if request.method == 'POST' and 'color' in request.POST:
        form4 = ColorForms(request.POST)
        if form4.is_valid():
            form4.save()

    if request.method == 'POST' and 'Req' in request.POST:
        form5 = DogRequestsForm(request.POST)
        if form5.is_valid():
            form5.save()

    form2 = SpeedsForms()
    form4 = ColorForms()
    form5 = DogRequestsForm()
    data = {
        'form2': form2,
        'formset': formset,
        'form4': form4,
        'form5': form5,
    }

    return render(request, 'main/dogsform.html', data)


мой html с скриптом дублирования:
{% block content %}
    <div class="features">
        <form method="post">
            {% csrf_token %}<br>
            {{ form4.as_p }}<br>
            <button class="btn btn-success" type="submit" name="color">Сохранить</button>
        </form>
        <form method="post">
            {% csrf_token %}<br>
            {{ form2.as_p }}
            <button class="btn btn-success" type="submit" name="speed">Сохранить</button>
        </form>
        <form id="form-container" method="post">
            {% csrf_token %}<br>
            {{DogFormSet.management_form}}
            <div class="DogForm">
            {{ formset.as_p }}<br>
            </div>
            <button id="add-form" type="button">Add Another dogs</button>
            <button class="btn btn-success" type="submit" name="dogs">Сохранить</button>
        </form>
        <form method="post">
            {% csrf_token %}<br>
            {{ form5.as_p }}<br>
            <button class="btn btn-success" type="submit" name="Req">Сохранить</button>
        </form>
    </div>

    <script>
        let DogForm= document.querySelectorAll(".DogForm")
        let container = document.querySelector("#form-container")
        let addButton = document.querySelector("#add-form")
        let totalForms = document.querySelector("#id_form-TOTAL_FORMS")

        let formNum = DogForm.length-1
        addButton.addEventListener('click', addForm)

        function addForm(e){
            e.preventDefault()

            let newForm = DogForm[0].cloneNode(true)
            let formRegex = RegExp(`form-(\\d){1}-`,'g')

            formNum++
            newForm.innerHTML = newForm.innerHTML.replace(formRegex, `form-${formNum}-`)
            container.insertBefore(newForm, addButton)

            totalForms.setAttribute('value', `${formNum+1}`)
        }
    </script>

{% endblock %}


В статье в html файле форму обрабатывают иначе, но если я сделаю так, как указано в статье форма не отображается. Вариант кода по статье для меня такой:
<form id="form-container" method="POST">
            {% csrf_token %}
            {{DogFormSet.management_form}}
            {% for form in DogFormSet %}
            <div class="DogForm">
            {{form.as_p}}
            </div>
            {% endfor %}
            <button id="add-form" type="button">Add Another dogs</button>
            <button class="btn btn-success" type="submit" name="dogs">Сохранить</button><br>
        </form>


Что нужно исправить? Корректный ли у меня views? Почему данные из дубликата формы не сохраняются?
  • Вопрос задан
  • 68 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы