2013-01-04 3 views
4

CSV를 업로드하고 데이터베이스에 저장해야합니다. 나는 초보자이며 아래는 'django-adapters'(http://django-adaptors.readthedocs.org/en/latest/index.html)를 사용하여 지금까지 달성 한 것들이다. 나는 그다지 많이 알지는 못한다. 더 자세히 알기 위해이 작업을하고 있습니다. :)장고 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

[the docs] (https://docs.djangoproject.com/en/dev/topics/http/file-uploads/)를 읽으셨습니까? 당신이 가진 문제는 정확히 무엇입니까? 파일 데이터를 얻기 위해'request.FILES'를 사용하여 거의 한 지점에있는 것처럼 보입니다. – Iguananaut

+0

옙, 나는 거의 파일 = request.FILES [file ']로 생각한다. 그러나 이것은 form.FILES [file]이 아닐 경우에는 틀린 것처럼 보인다. 요청을 사용하면 모든 폼 채우기가 무시된다. 또는 나는 무엇인가 놓치고있다. – Prometheus

+0

ok 나는 내가 무슨 일이 일어나고 있는지에 대한 나의 이해가 있다고 생각한다. 이 작품은 file = request.FILES [ 'file'] 그리고 나서 CodeCSvModel.import_from_file (file) 그러나 ... 내가 이해하지 못하는 부분은 어디서 업로드 되었습니까? – Prometheus

답변

5

장고 만 메모리에 업로드 된 파일을 유지 그렇지 않으면 임시 위치에 기록합니다.

누락 된 단계는 메모리/임시 위치에서 실제로 어딘가에 디스크에 파일을 쓰는 단계입니다.

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() 

청크는 파일이 매우 큰 경우 장고 디스크에 쓰기 전에 메모리에 파일의 각 청크를 읽을 수 있기 때문에, 길을 가야하는 것입니다. read()를 대신 사용하면 전체 파일을 메모리로 읽어 들이기 때문에 청크가 최선의 방법입니다.

2

그래서이 일 나는 거의이었다가 2.5MB 이하의 경우

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