如何使用Django的CreateView逐行保存Textarea表单数据?

20 浏览
0 Comments

如何使用Django的CreateView逐行保存Textarea表单数据?

我有一个模型,并希望使用Django中的文本区表单批量保存数据。数据应该逐行保存,我使用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()

请问我错在哪里。操作应该在其他地方进行吗?

0
0 Comments

问题的原因是self.object.save()会覆盖你的对象,你希望能够根据文本区域输入的每一行创建独立的数据库记录。解决方法是创建一个简单的数据录入表单forms.Form,而不是使用ModelForm。然后在form_valid方法中遍历每一行并创建对象,每次迭代应该创建一个新的对象并保存。同时,你还需要去掉文本区域字段。如果数据量很大,最好使用bulk create函数来提高性能。感谢您的建议,我理解您的逻辑。

0
0 Comments

在使用Django的CreateView时,我遇到了如何逐行保存Textarea表单数据的问题。经过阅读Stack Overflow上的一个解答,我找到了解决方法。在每次迭代开始时,我应该将主键设置为None。

具体的解决方法如下:

for each_line in data_line_list:
    self.object.pk = None    #添加这行代码
    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()

我明白这可能不是一个好的做法,但至少现在它能够正常工作了。

0