如何一次将多个对象保存到 Django 数据库
How to save multiple objects at once to Django database
我正在尝试使用 POST
请求获取表单数据并将表单数据保存到我的数据库中,该数据库是使用 django 模型创建的,即 InfoModel
。我从 POST
请求中获取数据,但我不知道如何一次保存所有数据,以便将它们全部保存到数据库中的同一行。我现在这样做的方式是,表单中的每个对象都保存到数据库的不同行,这显然根本没有用。我希望答案很简单,但我没有在文档中看到这个。
views.py:
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:
Models in django doesn't require model to be the suffix, so it will be better if you only give model name Info
rather than 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)
,这很方便,因为如果它不是 Post 请求,它将使用 None
创建一个空白表单,但如果是,则会填写表单如果是 Post 请求,则使用数据 request.POST
。
我正在尝试使用 POST
请求获取表单数据并将表单数据保存到我的数据库中,该数据库是使用 django 模型创建的,即 InfoModel
。我从 POST
请求中获取数据,但我不知道如何一次保存所有数据,以便将它们全部保存到数据库中的同一行。我现在这样做的方式是,表单中的每个对象都保存到数据库的不同行,这显然根本没有用。我希望答案很简单,但我没有在文档中看到这个。
views.py:
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:
Models in django doesn't require model to be the suffix, so it will be better if you only give model nameInfo
rather thanInfoModel
.
每次您调用 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)
,这很方便,因为如果它不是 Post 请求,它将使用 None
创建一个空白表单,但如果是,则会填写表单如果是 Post 请求,则使用数据 request.POST
。