Как сохранить данные формы Textarea построчно с помощью CreateView в Django?
У меня есть Модель и я хотел бы сохранить данные в виде пакета, используя форму 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()
Могу ли я узнать, где я ошибся. Нужно ли проводить манипуляции в другом месте?
self.object.save()
продолжает перезаписывать ваш объект. Вы хотите создать отдельные записи в db из каждой строки вашего ввода textarea.
Лучше создать простую форму forms.Form
для ввода данных вместо ModelForm.
Затем по его форме_valid, пройдитесь итерациями по строкам и создайте объекты. Каждая итерация должна создавать новый объект и сохраняться.
Вам нужно избавиться и от поля textarea.
Если данных много, лучше использовать функцию bulk create для повышения производительности.
Я нашел решение после прочтения этого 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()
Я понимаю, что это, возможно, не самый лучший способ, но, по крайней мере, теперь он работает.