Как импортировать базу данных из файла csv в django?

В моем webapp мне нужно разместить страницу, где пользователь может создать базу данных из загруженного файла csv. Я пытаюсь сделать это, используя def, как это сделано здесь https://docs.djangoproject.com/en/4.1/topics/http/file-uploads/, но, не работает.

Я полагаю, что модели работают успешно, потому что другие формы.

forms.py

class FileFieldForm(ModelForm):
    title = forms.CharField(max_length=50)
    file = forms.FileField()
    class Meta:
        model = Colecao
        fields = '__all__'

views.py

class ColecaoCSVCreate(CreateView):
    login_url = reverse_lazy('login')
    form_class = FileFieldForm
    template_name = 'formulario/formulario_csv.html'
    success_url = reverse_lazy('listar_colecao')

    def post(self, request,*args,**kwargs):
        form_class = self.get_form_class()
        form = self.get_form(form_class)
        files = request.FILES['sent_file']
        if form.is_valid():
            for f in files:
                reader = csv.DictReader(io.StringIO(f.read().decode('utf-8')))
                data = [line for line in reader]
            return self.form_valid(form)
        else:
            return self.form_invalid(form)

formulario_csv.html

    <form method="POST" enctype="multipart/form-data">
        
        {% csrf_token %}

        <input type="file" name="sent_file"/>
        
        {% if request.user.is_authenticated %}

            <button type="submit" class="btn btn-outline-primary">Confirmar</button>

        {% endif %}
        <a href="/listar/colecao/">
            <button type="button" class="btn btn-outline-danger">Cancelar</button>
        </a>
    </form>

Когда я загружаю csv, возникает ошибка MultiValueDictKeyError в /cadastrar/csv/colecao/ 'sent_file'

Вы можете прочитать CSV файл с помощью pandas и преобразовать каждую строку в dict:

import pandas as pd
df = pd.read_csv('your path file')
dict_df = df.to_dict(orient='records')

и позже вы можете использовать метод 'super' для экземпляра каждого элемента dict и сохранения в db:

сначала измените метод "init":

class FileFieldForm(ModelForm):
    title = forms.CharField(max_length=50)
    file = forms.FileField()

    class Meta:
        model = Colecao
        fields = '__all__'

    def __init__(self, my_dict):
        for key in my_dict:
            setattr(self, key, my_dict[key])

и теперь вы можете инициализировать ваш объект и сохранить, например:

for my_dict in dict_df:
    element = FileFieldForm(my_dict)
    element.save()
Вернуться на верх