Как сохранить сразу несколько объектов в базу данных Django

Я пытаюсь получить данные формы с помощью POST-запроса и сохранить данные формы в моей базе данных, которая была создана с помощью модели django под названием InfoModel. Я получаю данные из POST-запроса, но не знаю, как сохранить их все сразу, чтобы все они сохранились в одной строке в базе данных. Так, как я делаю это сейчас, каждый объект из формы сохраняется в отдельную строку базы данных, что, очевидно, совсем не полезно. Я ожидаю, что ответ прост, но я не видел этого в документации

views.py

from django.shortcuts import render

from django.http import HttpResponseRedirect

from .forms import InfoForm

from .models import InfoModel

# Create your views here.

def home(request):

if request.method == 'POST':
    #if POST request, validate the data 

    form = InfoForm(request.POST)

    if form.is_valid():
        #if the form is valid, collect the data, submit to db, and thank the user
        
        valid = True
        
        form_data = request.POST
        
        f = InfoModel(fname = form_data['fname'])
        
        f.save()
        
        l = InfoModel(lname = form_data['lname'])
        
        l.save()
        
        e = InfoModel(email = form_data['email'])
        
        e.save()
        
        p = InfoModel(phone = form_data['phone'])
        
        p.save()
         
        return render(request, 'form_db/home.html', {'form':form, 'valid':valid})
    
    else:
        #if the form is invalid, populate the form with the entered data and show error message
        valid = False
        
        form = InfoForm(request.POST)
        
        return render(request, 'form_db/home.html', {'form':form, 'valid':valid})

else:
    #if GET request, return blank form as normal 

    form = InfoForm()
 
    return render(request, 'form_db/home.html', {'form':form})

'''

Вы можете просто дать имена всех полей вашего InfoModel сразу следующим образом:

if form.is_valid():
    valid=True
    fName=form.cleaned_data['fname']
    lname=form.cleaned_data['lname']
    email=form.cleaned_data['email']
    phone=form.cleaned_data['phone']
 
    instance=InfoModel(fname=fName,lname=lname,email=email,phone=phone)
    instance.save()
    return render(request,"form_db/home.html",{'form': form,'valid':valid})
    

Note: Модели в django не требуют, чтобы модель была суффиксом, поэтому будет лучше, если вы дадите только имя модели Info, а не InfoModel.

Каждый раз, когда вы вызываете f = InfoModel(), вы инстанцируете новый экземпляр, а затем сохраняете его с помощью f.save(), вот почему вы получаете так много строк. Все это не нужно, поскольку форма имеет свой собственный метод save(), который сохранит все поля сразу в ОДНУ строку.

Лучший способ работы с формами - использовать классический метод Post/Redirect/Get, где если данные формы поступают в виде Post, то вы обрабатываете их и перенаправляете, обычно обратно в то же представление, но это может быть и другое представление. Если это Get, то вы выводите пустую форму.

def home(request):

    if request.method == 'POST':
        
        form = InfoForm(request.POST or None)
        
        if form.is_valid():
            form.save()
            return redirect('home')
     
        return render(request, 'form_db/home.html', {'form':form})

Обратите внимание на form = InfoForm(request.POST or None), который удобен, так как он создаст пустую форму с данными None, если это не Post-запрос, но если это так, то заполнит форму данными request.POST, если это Post-запрос.

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