2016-11-10 12 views
0

コードは単にCVSファイルをアップロードしてデータをLISTに変換するだけです。Django Upload 'filename'エラー

ユーザーがcsvファイルをアップロードすると、個々のユーザーが使用するファイル名は強制されません。私は、ユーザがcsvファイルに使用する任意のファイル名で作業できるようにしたいと考えています。私はこのエラーを取得しています

File "views.py", line 35, in upload_file phone_list = handle_uploaded_file(request.FILES['phonelistfile'])

File "views.py", line 17, in handle_uploaded_file with open(settings.MEDIA_URL+'documents/'+str(filename),'wb') as destination:

NameError: name 'filename' is not defined

Views.py

from django.shortcuts import render 

# Create your views here. 

from django.http import HttpResponseRedirect 
from .models import Upload 
from .forms import UploadFileForm 
import csv 
import io 

# Imaginary function to handle an uploaded file. 
#from somewhere import handle_uploaded_file 

def handle_uploaded_file(f): 
    with open(settings.MEDIA_URL+'documents/'+str(filename),'wb') as destination: 
     for chunk in f.chunks(): 
      destination.write(chunk) 
     destination.close() 
    #csvfile = f 
    csvfile = io.TextIOWrapper(f) # Python 3 Only 
    #dialect = csv.sniffer().sniff(codecs.EncodedFile(csvfile, "utf-8").read(1024)) 
    dialect = csv.sniffer().sniff(csvfile.read(1024), delimiter=";,") 
    #csvfile.open() 
    csvfile.seek(0) 
    #csvreader = csv.reader(codecs.EncodedFile(csvfile, "utf-8"), delimiter=',', dialect=dialect) 
    csvreader = csv.reader(csvfile, dialect) 
    return list(csvreader) 

def upload_file(request): 
    if request.method == 'POST': 
     form = UploadFileForm(request.POST, request.FILES) 
     if form.is_valid(): 
      phone_list = handle_uploaded_file(request.FILES['phonelistfile']) 
      upload_phone_list = Upload() 
      upload_phone_list.name = request.name 
      upload_phone_list.phonelistfile = request.FILES['file'].file 
      upload_phone_list.phonelist = phone_list 
      #form.save() 
      upload_phone_list.save() 

      return HttpResponseRedirect('/success/url/') 
    else: 
     form = UploadFileForm() 
    return render(request, 'upload.html', {'form': form}) 

models.py

from django.db import models 
#from django.forms import ModelForm 
from django.db import models 
from django.contrib.postgres.fields import ArrayField 

class Upload(models.Model): 
    name = models.CharField(max_length=50) 
    phonelistfile = models.FileField("phonelistfile", upload_to="media/%Y/%m/%d/") 
    upload_date = models.DateTimeField(auto_now_add =True) 
    phonelist = ArrayField(models.TextField()) 

Forms.py

from django import forms 
from .models import Upload 
from django.forms import ModelForm 

# FileUpload form class. 
class UploadFileForm(ModelForm): 
    #name = forms.CharField(max_length=100) 
    #phonelistfile = forms.FileField("phonelistfile", allow_empty_file=True, required=False) 
    class Meta: 
     model = Upload 
     fields = ('name', 'phonelistfile') 

回答: 私は答えを見つけることができました。さて、以下のコードを追加して、ユーザーがアップロードしたCSVファイルのファイル名を取得できます。これにより、使用して一つにviews.py中に二つの機能を崩壊: - FIL = request.FILES [ 'phonelistfile']次の行で

答えて

0

、あなたは決して

def upload_file(request): 
    if request.method == 'POST': 
     form = UploadFileForm(request.POST, request.FILES) 
     if form.is_valid(): 
      fil = request.FILES['phonelistfile'] 
      with open('f', 'wb+') as destination: 
       for chunk in fil.chunks(): 
        destination.write(chunk) 
        destination.close() 
      csvfile = io.TextIOWrapper(open('f', 'rb')) # Python 3 Only 
      #Do something with he file.... 

これは、トリックを行います....何を定義するかfilename

with open(settings.MEDIA_URL+'documents/'+str(filename),'wb') as destination: 

Djangoはそれが何であるか分かりません。あなたはどこかの値としてそれを設定する必要があります。

+0

ありがとうございます。同意する。しかし、私はどのようにファイル名が明示的に記述されていないような方法でコードを書いているのですか?私のユーザはアップロードのためにCSVファイルに任意の名前を使うことができるからです。 – Divino

+0

@Divino私はあなたの関数に渡された 'f'変数がファイルであると仮定していますか? 'str(filename)'の代わりに 'str(f.name)'を実行することができます。 – jape

+0

@ジェイド、私はそれを試みます。 – Divino