【问题标题】:Django Upload 'filename' errorDjango上传“文件名”错误
【发布时间】:2017-03-23 23:14:29
【问题描述】:

该代码只是上传 CVS 文件并将数据转换为 LIST。

当用户上传 csv 文件时,个人用户使用的文件名不会被强制执行。我希望能够使用用户用于 csv 文件的任何文件名。

我收到此错误:

文件“views.py”,第 35 行,在 upload_file 中 phone_list = handle_uploaded_file(request.FILES['phonelistfile'])

文件“views.py”,第 17 行,在 handle_uploaded_file 中 以 open(settings.MEDIA_URL+'documents/'+str(filename),'wb') 作为目标:

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中的两个函数合并为一个,使用:

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....   

这可以解决问题.... - fil = request.FILES['phonelistfile']

【问题讨论】:

    标签: python django csv


    【解决方案1】:

    在以下行中,您永远不会定义 filename 是什么:

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

    Django 不知道那是什么。您需要在某处将其设置为值。

    【讨论】:

    • 谢谢杰德。我同意。但是我如何以没有明确说明文件名的方式编写代码,因为我的用户可以为他们的 csv 文件使用任何名称进行上传。
    • @Divino 我假设传递给你的函数的f 变量是文件吗?如果是,您可以使用str(f.name),而不是str(filename)
    • @Jade,我会试试的。
    • 我已经找到了答案。通过将 views.py 中的两个函数合并为一个,使用:
    猜你喜欢
    • 1970-01-01
    • 2017-04-28
    • 1970-01-01
    • 1970-01-01
    • 2020-10-13
    • 1970-01-01
    • 2011-06-17
    • 2013-03-13
    • 2010-11-17
    相关资源
    最近更新 更多