Python Django读取/上载CSV

Python Django读取/上载CSV,python,django,Python,Django,我需要上传和读取CSV,然后保存到数据库。我是一名初学者,以下是我迄今为止使用“django适配器”所取得的成绩(http://django-adaptors.readthedocs.org/en/latest/index.html)我知道这并不多,但我这样做只是为了了解更多:) 我在我的代码的视图位中挣扎(如下)。我不知道如何上传然后将文件读入codesvModel()函数?有人能解释一下吗?非常感谢。:) 视图.py from django.template import RequestCo

我需要上传和读取CSV,然后保存到数据库。我是一名初学者,以下是我迄今为止使用“django适配器”所取得的成绩(http://django-adaptors.readthedocs.org/en/latest/index.html)我知道这并不多,但我这样做只是为了了解更多:)

我在我的代码的视图位中挣扎(如下)。我不知道如何上传然后将文件读入codesvModel()函数?有人能解释一下吗?非常感谢。:)

视图.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))  
class codeUploadForm(forms.Form):

    file = forms.FileField()
    place = forms.ModelChoiceField(queryset=Incentive.objects.all())
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
forms.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))  
class codeUploadForm(forms.Form):

    file = forms.FileField()
    place = forms.ModelChoiceField(queryset=Incentive.objects.all())
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
csvTool.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))  
class codeUploadForm(forms.Form):

    file = forms.FileField()
    place = forms.ModelChoiceField(queryset=Incentive.objects.all())
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

所以这起作用了,我就快到了:

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

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(),它会将整个文件读入内存,因此块是最好的选择。

您读过吗?你到底有什么问题?看起来你差不多就在那里了--使用
request.FILES
来获取文件数据。是的,我认为file=request.FILES['file']几乎就在那里了,但是如果不是表单,这似乎是错误的。FILES['file'],因为使用request可以绕过所有表单填充。或者我遗漏了什么。好吧,我想我在那里,只是我对正在发生的事情的理解不清楚。这可以工作file=request.FILES['file']然后codesvModel.import\u from\u file(文件),但是。。。我不明白的是它上传到哪里了?我想你对使用表单对象处理POST请求的目的感到困惑。我不是Django专家,所以除了验证编码之外,我甚至不确定Form对象对文件上传做了什么。文件没有“上传”到你可能指的任何地方。客户端正在将文件数据上载到web服务器,而请求对象只是为文件数据流提供一个类似文件的只读句柄。那么这个只读文件在内存中吗?听起来很糟糕!