2013-01-04 45 views
4

我需要上傳並讀取CSV然後保存到數據庫。我是初學者,下面是我使用'django-adapters'取得的成就(http://django-adaptors.readthedocs.org/en/latest/index.html)。我知道它不是很多, M只是這樣做,以瞭解更多:)Django閱讀/上傳CSV

我在我的代碼的視圖位於掙扎(下)。我不知道如何上傳,然後將文件讀入CodeCSvModel()函數?任何人都可以解釋嗎?非常感謝。 :)

views.py

from django.template import RequestContext 
from django.shortcuts import render_to_response 
from web.forms import codeUploadForm 
from web.csvTools import CodeCSvModel 


def codeImport(request): 
    # If we had a POST then get the request post values. 
    if request.method == 'POST': 
     form = codeUploadForm(request.POST, request.FILES) 
     # handle_uploaded_file(request.FILES['file']) 

       ====[HELP HERE]===== 

     #form = codeUploadForm(request.POST) 

     CodeCSvModel.import_from_file(form['file']) 



    else: 
     form = codeUploadForm() 
     context = {'form':form} 
     return render_to_response('import.html', context, context_instance=RequestContext(request)) 

forms.py

class codeUploadForm(forms.Form): 

    file = forms.FileField() 
    place = forms.ModelChoiceField(queryset=Incentive.objects.all()) 

csvTool.py

from datetime import datetime 
from adaptor.fields import * 
from adaptor.model import CsvModel, CsvDbModel, ImproperlyConfigured,\ 
    CsvException, CsvDataException, TabularLayout, SkipRow,\ 
    GroupedCsvModel, CsvFieldDataException 
from web.models import * 



class CodeCSvModel(CsvModel): 

    codeid = CharField() 
    remotecode = CharField() 
    active = BooleanField() 
    created = DateField() 
    modified = DateField() 
    incentiveid = CharField() 

    class Meta: 
     delimiter = ";" 
     dbModel = Code 
+1

你看過[文檔](https://docs.djangoproject.com/en/dev/topics/http/file-uploads/)嗎?你遇到的問題究竟是什麼?看起來你幾乎在某處 - 使用'request.FILES'來獲取文件數據。 – Iguananaut

+0

是的,我認爲我幾乎在那裏與文件= request.FILES ['文件']但這似乎是錯誤的,如果它不是form.FILES ['文件']作爲使用請求繞過所有形式的人口。或者我錯過了什麼。 – Prometheus

+0

好吧我想我在那裏只是我對發生了什麼事的瞭解。這工作文件= request.FILES ['文件'],然後CodeCSvModel.import_from_file(文件)但是...我不明白的是它上傳的地方? – Prometheus

回答

5

的Django僅在內存中保存上傳的文件,如果它是2.5MB或更小,否則將其寫入到一個臨時位置。

您錯過的步驟是您實際將文件從內存/臨時位置寫入磁盤某處的位置,例如,

if request.method == 'POST': 
    form = MyForm(request.POST, request.FILES) 
    if form.is_valid(): 
     uploaded_file = request.FILES['html-file-attribute-name'] 

     # Write the file to disk 
     fout = open("path/to/save/file/to/%s" % uploaded_file.name, 'wb') 
     for chunk in uploaded_file.chunks(): 
      fout.write(chunk) 
     fout.close() 

分塊是,去,如果該文件是非常大的,因爲Django會在寫入磁盤之前讀取文件到內存中的每個塊的方式。如果使用read(),它會將整個文件讀入內存,所以塊是最好的選擇。

2

所以這個工作,我幾乎有:

file = request.FILES['file'] 
     CodeCSvModel.import_from_file(file) 
     return render_to_response('import.html', context_instance=RequestContext(request))