django多个html文件上传,Django 速成笔记(5) 文件上传 多个文件上传 之三种方法

Django 的文件上传可以说是相当的简单了,我们来看看

1.

第一种比较简单,但是可控度相对来说要高一些。

forms.py

#定义上传表单

class UploadFileForm(forms.Form):

title = forms.CharField(max_length=50)

file = forms.FileField()

views.py

# 文件上传视图方法1

def upload_file(request):

if request.method == 'POST':

form = UploadFileForm(request.POST, request.FILES)

if form.is_valid():#表单数据如果合法

handle_uploaded_file(request.FILES['file'])#处理上传来的文件

return HttpResponse('文件上传成功!')

else:

form = UploadFileForm()

return render(request, 'blog/upload.html', {'form':form})

#文件保存方法

def handle_uploaded_file(f):

today = str(datetime.date.today())#获得今天日期

file_name = today + '_' + f.name#获得上传来的文件名称,加入下划线分开日期和名称

file_path = os.path.join(os.path.dirname(__file__),'upload_file',file_name)#拼装目录名称+文件名称

with open(file_path, 'wb+') as destination:

for chunk in f.chunks():

destination.write(chunk)

templates

loginfrom

{% csrf_token %}

{{ form }}

其中需要一个控制文件保存的方法,设置保存目录及保存的文件名。

2.

我们再看看第二种文件上传方法,相对来说更简单一些,但需要配置一下model。

models.py 先定义一个model,然后记得更新数据库生成表。

class FileModel(models.Model):

title = models.CharField(max_length=50)

file = models.FileField(upload_to='uploads/%Y%m%d/')

forms.py

form的代码没有什么变化。

#定义上传表单

class UploadFileForm(forms.Form):

title = forms.CharField(max_length=50)

file = forms.FileField()

views.py

视图代码中用了一个Django 自带的save()的方法代替了之前我自己定义的方法。

# 文件上传视图方法2

def upload_file(request):

if request.method == 'POST':

form = UploadFileForm(request.POST, request.FILES)

if form.is_valid():#表单数据如果合法

upload_from = FileModel()

upload_from.title = form.cleaned_data['title']

upload_from.file = form.cleaned_data['file']

upload_from.save()#处理上传来的文件

return HttpResponse('文件上传成功!')

else:

form = UploadFileForm()

return render(request, 'blog/upload.html', {'form':form})

模板中的代码没有变化。

3.

多个文件的上传方法

models.py

这上多文件上传的代码来自Django官方的示例

#这个方法可以定义上传文件的目录和名字。如果通过

def user_directory_path(instance, filename):

# file will be uploaded to MEDIA_ROOT/user_/

return 'uploads/%Y%m%d-{0}'.format(filename)

class FileModel(models.Model):

title = models.CharField(max_length=50)

file = models.FileField(upload_to=user_directory_path)

forms.py

# 多个文件上传

class FileFieldForm(forms.Form):

file_field = forms.FileField(widget=forms.ClearableFileInput(attrs={'multiple': True}))

views.py

视图中的代码有一个循环迭代for,这里分别去用handle_uploaded_file()方法保存上传来的多个文件 handle_uploaded_file(f)方法参见上边。

# 多个文件上传视图

def upload_file(request):

if request.method == 'POST':

form = FileFieldForm(request.POST, request.FILES)

files = request.FILES.getlist('file_field')#获得多个文件上传进来的文件列表。

if form.is_valid():#表单数据如果合法

for f in files:

handle_uploaded_file(f)#处理上传来的文件

return HttpResponse('文件上传成功!')

else:

form = FileFieldForm()

return render(request, 'blog/upload.html', {'form':form})

模板代码忽略。。。

多文件上传也可以自己组织html上传的表单代码,只要记得上传来的多个文件是一个list然后for循环迭代处理一下即可。而且我们可以试试,用save()来处理多个文件的上传保存。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值