Как сохранить сразу несколько объектов в базу данных 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-запрос.