Добрый день! В моем проекте джанго необходимо на одной странице использовать сразу 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.