如何一次将多个对象保存到 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