2017-06-03 110 views
1

我有一个Django模型的宿舍,其中一个字段FileUpload从中我将采取一个CSV文件并填充数据库,我一直在尝试过去两天搜索如何这样做,但不能得到那个工作 这个how to import csv data into django models问题的作品,但只有当我有文件的路径,我尝试了很多方法,但没有成功。此外在那之后我试图寻找更难How do I get a files absolute path after being uploaded in Django?我看到这个但即使如此,因为它显示了一些错误将数据从一个CSV文件存储到数据库

我用这个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,然后通过解析填充数据库的FileField的形式,问题在于:我们不能硬编码路径。那么我们应该怎么做。

EDIT 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

回答

0

您可以轻松地重写表单的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 
+0

我是新手,精心制作怎么样。 – 4rshdeep

+0

将此代码添加到您的'DocumentForm'中,然后迭代您的文件并将其保存到数据库中 –

+0

@unpaired_electron在另一个[post](https://stackoverflow.com/a/44343404/1526703)上看到您的问题,然后返回检查你是否仍然需要帮助。在Moe Far的回复中,_file_是接受csv文件路径的字段的名称(因此您不必对其进行硬编码)。一旦你按照Moe的建议添加了上面的代码,用户可以简单地在前端输入路径,并且可以将csv提供给数据库(你如何从csv填充数据库,进入'做你想做的任何事情'部分在上面的代码中)。回复,如果你需要更多的澄清 – Anupam

相关问题