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



我有一个模型,希望通过在Django中使用文本区域表单将数据保存为批处理。数据应该逐行保存,我使用的是splitlines((,每个数据都用逗号分隔(","(。我正在操作form_valid((函数中的操作,但似乎无法正确操作。

只有最后一行保存成功。

表单.py

class DataForm(forms.ModelForm):
textarea_data = forms.CharField(widget=forms.Textarea)
class Meta:
model = Item
exclude = ('part_number','length','height','weight')

视图.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()

我可以知道我哪里错了吗。操纵应该在其他地方进行吗?

self.object.save()不断覆盖您的对象。您希望从文本区域输入的每一行创建单独的数据库记录。

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

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

您还需要去掉文本区域字段。

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

我在阅读后找到了解决方案https://stackoverflow.com/a/33027228/13152307。

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

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()

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

相关内容

  • 没有找到相关文章

最新更新