2017-06-03 109 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

相關問題