Отправка массовых форм в 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 в своих комментариях. Однако я считаю, что упомянутое мной решение немного проще в реализации и понимании (по крайней мере, лично для меня)

Вернуться на верх