如何使用django表单保存多个记录

时间:2017-08-25 21:15:37

标签: python django

我有一个简单的表单,这是我的视图代码的一部分:

if request.method == 'POST':
    form = testForm( request.POST )
    if form.is_valid():
        record = form.save(commit=False)
        record.save()

一切都很好,这些工具可以保存数据,但我试图发送多条记录,我的意思是我发送一个实例10条记录,但程序只能保存一条。

解决这个问题的最佳解决方案是什么?

提前致谢,

1 个答案:

答案 0 :(得分:0)

发送10条记录不会为您创建10条记录。您提供的代码只会尝试:

  1. 创建一个有界的表单实例。
  2. 仅验证并保存模型实例。
  3. 您必须循环 n次才能创建 n-bound形式/模型实例。

    首先:以一种很好的方式在POST请求中发送数据,以便您可以在视图中正确分隔它。 词典列表可能是不错的选择。类似的东西:

    [{' Field1':' some_value' ,' Field2':' some_value',...},

    {' Field1':' some_value' ,' Field2':' some_value',...},

    {' Field1':' some_value' ,' Field2':' some_value',...} ...]

    现在在views.py中,循环浏览此列表,如:

    if request.method == 'POST':
        for single_data_instance in request.POST:
            form = testForm(single_data_instance)
            if form.is_valid():
                record = form.save(commit=False)
                record.save()
    

    修改

    如果你想要一个经典的for-loop之外的东西那么,

    1. django's bulk_create() function。但我必须警告你,有一些警告。您可以在上面给出的链接中看到所有这些内容。

      但遗憾的是,bulk_create()的功能尚未扩展到ModelForms。您将不得不使用save()方法进行一些更改,这将是一个很大的开销。

    2. 您也可以使用lambda函数,但在这种情况下它只会让事情变得更加麻烦。

    3. 所以在我看来,为什么不使用经典的for循环呢?

      最后:如果您的html的name属性相同,则无关紧要。如:

      <input type="text" name="test">
      <input type="text" name="test">
      

      绑定表单只能占用其中定义的字段(显式声明或通过ModelForm元声明)。发送字典超过表单可以使用的字典是没有用的。它只是忽略它。

      希望这会对你有所帮助。感谢。