Как сохранить данные формы 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()

Я понимаю, что это, возможно, не самый лучший способ, но, по крайней мере, теперь он работает.

Вернуться на верх