Задать вопрос
@Enter_a_nickname

Как использовать несколько форм на одной странице?

Добрый день! В моем проекте джанго необходимо на одной странице использовать сразу 4 формы связанных с моделью. Я попробовал реализовать данное решение с помощью prefix для каждой формы. Формы удалось отобразить в html шаблоне, но не удается сохранить данные в бд. Почему?
Вот мой код:

views.py:
def dog(request):
    error = ''
    if request.method == 'POST':
        form2 = SpeedsForms(request.POST, prefix='form2')
        form3 = DogsForms(request.POST, prefix='form3')
        form4 = ColorForms(request.POST, prefix='form4')
        form5 = DogRequestsForm(request.POST, prefix='form5')
        if form2.is_valid() and form3.is_valid() and form4.is_valid() and form5.is_valid():
            form2.save()
            form3.save()
            form4.save()
            form5.save()
            return redirect('home')
        else:
            error = 'Форма заполненна некорректно'

    form2 = SpeedsForms()
    form3 = DogsForms()
    form4 = ColorForms()
    form5 = DogRequestsForm()
    data = {
        'form2': form2,
        'form3': form3,
        'form4': form4,
        'form5': form5,
        'error': error
    }
    return render(request, 'main/dogsform.html', data)


мой urls.py:
path('dog', views.dog, name='dogsform')

мой 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"
            })
        }

class DogsForm(ModelForm):
    class Meta:
        model = Dog
        fields = ['name', 'number', 'Speed', 'DataTime']
        widgets = {
            "name": TextInput(attrs={
                'class': 'form-control',
                'placeholder': "name"
            }),
            "number": NumberInput(attrs={
                'class': 'form-control',
                'placeholder': "number"
            }),
            "Speed": SelectMultiple(attrs={
                'class': 'form-control',
                'placeholder': "Speed"
            }),
            "DataTime": DateTimeInput(attrs={
                'class': 'form-control',
                'placeholder': "DataTime"
            }),
        }

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


И наконец мой HTMl:
{% block content %}
    <div class="features">
        <h1>Color</h1>
        <form method="post">
            {% csrf_token %}<br>
            {{ form4.temp }}<br>
            {{ form4.correct }}<br>
            {{ form4.top }}<br>
            {{ form4.bottom }}<br>
            <button class="btn btn-success" type="submit">Сохранить</button>
            <span>{{ error }}</span>
        </form>
        <form method="post">
            {% csrf_token %}<br>
            {{ form2.start }}<br>
            {{ form2.end }}<br>
            <button class="btn btn-success" type="submit">Сохранить</button>
            <span>{{ error }}</span>
        </form>
        <form method="post">
            {% csrf_token %}<br>
            {{ form3.name }}<br>
            {{ form3.number }}<br>
            {{ form3.Speed}}<br>
            {{ form3.DataTime }}<br>
            <button class="btn btn-success" type="submit">Сохранить</button>
            <span>{{ error }}</span>
        </form>
         <form method="post">
            {% csrf_token %}<br>
            {{ form5.id_name}}<br>
            {{ form5.Color}}<br>
            {{ form5.Dog}}<br>
            <button class="btn btn-success" type="submit">Сохранить</button>
            <span>{{ error }}</span>
        </form>
    </div>
{% endblock %}


При этом, если я уберу prifix например для color другие формы перестают отображаться на странице, но color успешно сохраняется в бд.
Что нужно исправить чтобы успешно сохранять данные из всех форм?
Так же буду благодарен если подскажете, как поступить с связанными моделями? Ведь например в форме номер 5 я использую связанные модели (color и dog) которые мне необходимо создать ранее чем я заполню форму номер 5.
  • Вопрос задан
  • 123 просмотра
Подписаться 2 Простой Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

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