Несколько форм с одним единственным представлением для создания в 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>