Несколько форм с одним единственным представлением для создания в Django

У меня есть 5 форм: MyForm, EducationForm, ExperienceForm, RecommendationForm, OtherDocumentsForm. Я хочу разместить их в одном шаблоне формы. Я не могу сделать это с помощью CreateView, потому что он принимает только один класс формы. Как я могу создать одно представление для нескольких форм?

class MyForm(forms.ModelForm):
    class Meta:
        model = UserForm_uz
        fields = 'all'

class EducationForm(forms.ModelForm):
    class Meta:
        model = Education_uz
        fields = 'all'

class ExperienceForm(forms.ModelForm):
    class Meta:
        model = Experience_uz
        fields = 'all'

class RecommendationForm(forms.ModelForm):
    class Meta:
        model = Recommendation_uz
        fields = 'all'

class OtherDocumentsForm(forms.ModelForm):
    class Meta:
        model = OtherDocuments
        fields = 'all'

Я хочу, чтобы все формы были отправлены одним запросом и одной кнопкой. Они связаны между собой foreignkey EducationForm, ExperienceForm, RecommendationForm, OtherDocumentsForm связаны с MyForm с foreignKey

Поскольку MyForm будет подаваться одновременно с другими формами, вам нужно исключить поле ForeignKey для UserForm_uz из всех других моделей, связанный объект еще не существует, поэтому вы не можете его выбрать

class EducationForm(forms.ModelForm):
    class Meta:
        model = Education_uz
        # Repeated for all four forms
        exclude = ['user']  # Whatever the ForeignKey to UserForm_uz is named

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

def my_view(request):
    if request.method == 'POST':
        my_form = MyForm(request.POST, request.FILES, prefix='user')
        education_form = EducationForm(request.POST, request.FILES, prefix='education')
        experience_form = ExperienceForm(request.POST, request.FILES, prefix='experience')
        if all([my_form.is_valid(), education_form.is_valid(), experience_form.is_valid()]):
            user = my_form.save()
            education = education_form.save(commit=False)
            education.user = user
            education.save()
            experience = experience_form.save(commit=False)
            experience.user = user
            experience.save()
            return redirect('some-view')
    else:
        my_form = MyForm(prefix='user')
        education_form = EducationForm(prefix='education')
        experience_form = ExperienceForm(prefix='experience')
    return render(request, 'template.html', {'my_form': my_form, 'education_form': education_form, 'experience_form': experience_form})

В вашем шаблоне (template.html) вам нужно будет вывести все формы в один тег form

<form method="POST" enctype="multipart/form-data">
    {% csrf_token %}
    {{ my_form }}
    {{ education_form }}
    {{ experience_form }}
    <input type="submit" />
</form>
Вернуться на верх