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()来处理多个文件的上传保存。。。