Отправка массовых форм в Django
У меня есть 5 различных форм в forms.py
; все формы основаны на одной модели. Все 5 форм отображаются на одной html-странице, чтобы пользователь мог создать или зарегистрировать 5 объектов в БД одним нажатием кнопки.
В будущем мне может понадобиться отправить 50 форм за один клик. Если бы я делал это на основе существующего кода, мне, вероятно, понадобилось бы 50 форм в forms.py
и повторить логику регистрации в views.py
50 раз.
Есть ли более эффективный способ сделать это?
views.py
def register(request):
form1 = DetailsForm1()
form2 = DetailsForm2()
form3 = DetailsForm3()
form4 = DetailsForm4()
form5 = DetailsForm5()
if request.method == "POST":
form1 = DetailsForm1(request.POST)
if form1.is_valid():
form1.save()
form2 = DetailsForm2(request.POST)
if form2.is_valid():
form2.save()
form3 = DetailsForm3(request.POST)
if form3.is_valid():
form3.save()
form4 = DetailsForm3(request.POST)
if form3.is_valid():
form3.save()
form5 = DetailsForm5(request.POST)
if form5.is_valid():
form5.save()
return render(request, "app/registration_completed.html")
context = {
"form1": form1,
"form2": form2,
"form3": form3,
"form4": form4,
"form5": form5
}
return render(request, "app/register.html", context)
forms.py
class DetailsForm1(forms.ModelForm):
class Meta:
model = Property
fields = (
'owner',
'address',
'postcode',
)
class DetailsForm2(forms.ModelForm):
class Meta:
model = Property
fields = (
'owner',
'address',
'postcode',
)
class DetailsForm3(forms.ModelForm):
class Meta:
model = Property
fields = (
'owner',
'address',
'postcode',
)
class DetailsForm4(forms.ModelForm):
class Meta:
model = Property
fields = (
'owner',
'address',
'postcode',
)
class DetailsForm5(forms.ModelForm):
class Meta:
model = Property
fields = (
'owner',
'address',
'postcode',
)
Вам не нужно несколько форм в forms.py, и вместо этого вы можете сделать что-то вроде этого:
def register(request):
form1 = DetailsForm()
form2 = DetailsForm()
form3 = DetailsForm()
...
if request.method == "POST":
form1 = DetailsForm(request.POST)
if form1.is_valid():
form1.save()
form2 = DetailsForm(request.POST)
if form2.is_valid():
form2.save()
form3 = DetailsForm(request.POST)
if form3.is_valid():
form3.save()
...
return render(request, "app/registration_completed.html")
context = {
"form1": form1,
"form2": form2,
"form3": form3,
...
}
return render(request, "app/register.html", context)
с одной формой, определенной как в:
class DetailsForm(forms.ModelForm):
class Meta:
model = Property
fields = (
'owner',
'address',
'postcode',
)
Вы можете оптимизировать процесс дальше, если у вас так много форм, используя некоторые циклы и списки следующим образом:
def register(request):
forms = []
for i in range(30):
forms.append(DetailsForm())
if request.method == "POST":
for form in forms:
form = DetailsForm(request.POST)
if form.is_valid():
form.save()
(и продолжить остальную часть кода с тем же методом перебора форм)
Другим решением может быть использование наборов форм, как упомянул Anentropic в своих комментариях. Однако я считаю, что упомянутое мной решение немного проще в реализации и понимании (по крайней мере, лично для меня)