【问题标题】:Storing Data from a CSV File into a database将 CSV 文件中的数据存储到数据库中
【发布时间】:2017-11-04 16:35:05
【问题描述】:

我有一个宿舍的 Django 模型,其中一个字段是 FileUpload,我将从该字段中获取一个 CSV 文件并填充数据库,过去两天我一直在尝试搜索如何做到这一点,但无法让它工作 这个how to import csv data into django models 问题有效,但前提是我有文件的路径,并且我尝试了很多方法但没有成功。在那之后我尝试更努力地搜索How do I get a files absolute path after being uploaded in Django? 我看到了这个,但即使这样我也无法让它工作,因为它显示了一些错误

我使用了这个 URL 映射 url(r'^test/$',views.FileUpload.as_view(),name="test")

但它显示了一些命名空间错误。 请告诉我该怎么做,如果您对我有一些建议,我应该如何重新开始,我真的很失落。 我想从用户那里获取一个文件,然后填充数据库

这个(How do I transfer data in .csv file into my sqlite database in django?) 是否可以像我们可以创建一个带有接受 csv 的文件字段的表单然后通过解析填充数据库一样,问题在于我们无法对路径进行硬编码。那我们应该怎么做呢。

编辑 views.py

from django.views import View
class FileUpload(View):
    def post(self, request):
        form = DocumentForm(request.POST, request.FILES)
        if form.is_valid():
            initial_obj = form.save(commit=False)
            data=initial_obj['document']
            with open((data),'rb') as csvfile:
                spamreader = csv.reader(csvfile)
                for row in spamreader:
                    _, created=Document.objects.get_or_create(
                    name=row[0],
                    description = row[1],
                    importance=row[2],
                    )

            initial_obj.save()
            form.save()
            return redirect('/')
        else:
            return render(request,'file_upload_form.html',{'form':form})

    def get(self, request):
        return render(request, 'file_upload_form.html', {'form': form,})

forms.py

class DocumentForm(forms.ModelForm):
    class Meta:
        model = Document
        fields = ('description', 'document', )

models.py

class Document(models.Model):
    name=models.CharField(max_length=50,blank=True)
    description=models.CharField(max_length=255, blank=True)
    importance=models.CharField(max_length=10, default="High")
    document = models.FileField(upload_to='documents/')
    uploaded_at = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.description

我没有收到任何错误,但它没有将 CSV 文件中的数据保存在数据库中,并将我重定向到必须完成上传的同一页面,并在文档字段中显示错误“此字段是必需的”。

更新:我解决了更多细节here

【问题讨论】:

    标签: python django csv


    【解决方案1】:

    您可以轻松覆盖表单的clean() 方法,并将自定义数据内容保存到数据库中

     def clean(self):
        super(DocumentForm, self).clean()
        import csv
        with open((self.cleaned_data['file']), 'rb') as csvfile:
        spamreader = csv.reader(csvfile)
        for row in spamreader:
            // DO WHATEVER YOU WANT
    

    【讨论】:

    • 我是新手,请详细说明。
    • 将此代码添加到您的 DocumentForm 中,然后迭代您的文件并将其保存到数据库中
    • @unpaired_electron 在另一个 post 上看到了您的问题,然后返回查看您是否仍需要帮助。在 Moe Far 的响应中,file 是接受 csv 文件路径的字段的名称(因此您不必对其进行硬编码)。按照 Moe 的建议添加上述代码后,用户只需在前端输入路径,您就可以将 csv 输入数据库(如何从 csv 填充数据库,进入“做任何你想做的事”部分在上面的代码中)。如果您需要更多说明,请回复
    • 先生,我收到一个错误'form' is not defined In views.py(我在 get 中修复了丢失的表单),问题是我找不到有关如何使用 django.views 的文档.查看 (docs.djangoproject.com/en/1.11/ref/class-based-views/base)。我看过它,但我觉得对于像我这样的新手来说还不够。 TL,DR:我收到错误“未定义表单”。
    • 现在,其他一切都在工作,但是当我点击上传时,它什么也没做,它转到显示需要文件的同一页面。
    猜你喜欢
    • 2019-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-11
    • 2015-03-14
    • 2019-01-24
    • 1970-01-01
    相关资源
    最近更新 更多