我需要上传并读取CSV然后保存到数据库。我是初学者,下面是我迄今为止使用'django-adapters'(http://django-adaptors.readthedocs.org/en/latest/index.html)所取得的成就。我知道它不是很多,但我'我只是这样做了解更多:)
我在我的代码的视图位(下面)中苦苦挣扎。我不知道如何上传然后将文件读入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
答案 0 :(得分:5)
如果上传的文件是2.5MB或更小,Django只会将上传的文件保留在内存中,否则会写入临时位置。
您缺少的步骤是将文件从内存/临时位置实际写入磁盘的位置,例如。
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()
如果文件非常大,则Chunking是要走的路,因为Django会在写入磁盘之前将文件的每个块读入内存。如果你改用read(),它会把整个文件读入内存,所以你最好选择chunk。
答案 1 :(得分:2)
所以这很有用,我几乎就在那里:
file = request.FILES['file']
CodeCSvModel.import_from_file(file)
return render_to_response('import.html', context_instance=RequestContext(request))