我有一个模型,希望通过在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()
我知道这样做可能不是一个好方法,但至少它现在起作用了。