4

CSVをアップロードして読み取り、データベースに保存する必要があります。私は初心者であり、以下は「django-adaptors」(http://django-adaptors.readthedocs.org/en/latest/index.html)を使用してこれまでに達成したことです。 m詳細を学ぶためにこれを行うだけです:)

コードのビュービット(下記)で苦労しています。ファイルをアップロードして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
4

2 に答える 2

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()を使用すると、ファイル全体がメモリに読み込まれるため、チャンクが最善の策です。

于 2013-01-05T01:43:42.693 に答える
2

だからこれはうまくいきました、私はほとんどそこにいました:

 file = request.FILES['file']
        CodeCSvModel.import_from_file(file)
        return render_to_response('import.html', context_instance=RequestContext(request))
于 2013-01-04T17:25:38.287 に答える