【问题标题】:How do you save Textarea form data line by line using Django's CreateView?如何使用 Django 的 CreateView 逐行保存 Textarea 表单数据?
【发布时间】:2022-01-22 17:10:53
【问题描述】:

我有一个模型,想通过在 Django 中使用 textarea 表单将数据保存为批处理。数据要逐行保存,我用的是splitlines(),每个数据用split(",")隔开。我在 form_valid() 函数中进行操作,但似乎无法正确操作。

只有最后一行保存成功。

forms.py

class DataForm(forms.ModelForm):
   textarea_data = forms.CharField(widget=forms.Textarea)

   class Meta:
       model = Item
       exclude = ('part_number','length','height','weight')

views.py

class InsertData(generic.CreateView):
    model = Item
    form_class = DataForm

    def get_success_url(self):
        return reverse('item_list')

    def form_valid(self, form):
        self.object = form.save(commit=False)
        textarea_data = form.cleaned_data['textarea_data ']
        data_line_list = textarea_data.splitlines()

        for each_line in data_line_list:
            each_line_list = each_line.split(",")
            self.object.part_number = each_line_list[0]
            self.object.length = each_line_list[1]
            self.object.weight = each_line_list[2]
            self.object.height = each_line_list[3]
            self.object.save()
        

请问我哪里出错了。是否应该在其他地方进行操作?

【问题讨论】:

    标签: django textarea


    【解决方案1】:

    self.object.save() 不断覆盖您的对象。您想从 textarea 输入的每一行创建单独的数据库记录。

    最好为数据输入创建一个简单的表单forms.Form 而不是 ModelForm。

    然后在其 form_valid 上,遍历行并创建对象。每次迭代都应该创建一个新对象并保存。

    你也需要去掉 textarea 字段。

    如果数据量很大,最好使用批量创建功能来提高性能。

    【讨论】:

    • 我理解你的逻辑,谢谢你的建议。
    【解决方案2】:

    读完这个https://stackoverflow.com/a/33027228/13152307我找到了解决办法。

    我应该在每次迭代开始时将主键设置为无。

    for each_line in data_line_list:
        self.object.pk = None    #add this line
        each_line_list = each_line.split(",")
        self.object.part_number = each_line_list[0]
        self.object.length = each_line_list[1]
        self.object.weight = each_line_list[2]
        self.object.height = each_line_list[3]
        self.object.save()
    

    我知道这样做可能不是一个好方法,但至少现在可以了。

    【讨论】:

      猜你喜欢
      • 2020-06-06
      • 1970-01-01
      • 2020-07-07
      • 2016-01-05
      • 1970-01-01
      • 2021-06-05
      • 2014-06-05
      • 1970-01-01
      • 2015-08-08
      相关资源
      最近更新 更多