Django如何实现文件上传下载
Django如何实现文件上传下载
小编给大家分享一下Django如何实现文件上传下载,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!
1. 前言
文件上传、下载作为基础功能,在 Web 项目中非常普遍,Django 项目如何实现文件上传下载?
2. 实战一下
2-1 进入虚拟环境,创建一个项目及 App
workondjango3#创建项目django-adminstartprojectfile_up_and_down_demo#进入项目根目录cdfile_up_and_down_demo/#创建一个Appdjango-adminstartappindex
2-2创建模板目录并配置 settings.py
在 index App 下创建一个 templates 文件夹,然后在项目配置文件 settings.py 中配置 App 及模板目录
#settings.py#配置AppINSTALLED_APPS=['django.contrib.admin','django.contrib.auth','django.contrib.contenttypes','django.contrib.sessions','django.contrib.messages','django.contrib.staticfiles','index',]TEMPLATES=[{'BACKEND':'django.template.backends.django.DjangoTemplates','DIRS':[#配置模板目录os.path.join(BASE_DIR,'index/templates')],'APP_DIRS':True,'OPTIONS':{'context_processors':['django.template.context_processors.debug','django.template.context_processors.request','django.contrib.auth.context_processors.auth','django.contrib.messages.context_processors.messages',],},},]
2-3 创建文件模型,并映射到数据库
以默认的 sqlite 为例,在 index App 下的 models.py 中自定义一个代表文件的模型
该模型包含 3 个字段:
文件名称
文件保存路径
上传时间
#indexAppmodels.pyfromdjango.dbimportmodelsfromdjango.utilsimporttimezone#文件模型classFileModel(models.Model):#文件名称name=models.CharField(max_length=50)#文件保存路径path=models.CharField(max_length=100)#上传时间upload_time=models.DateTimeField(default=timezone.now)
然后,在项目根目录下执行下面 2 条命令,将模型结构映射到数据库中
#数据库映射Python3manage.pymakemigrationspython3manage.pymigrate
2-4自定义表单控件
在 index App 下创建一个表单文件 forms.py
在内部自定义一个表单类,继承于forms.Form
#indexAppforms.pyfromdjangoimportformsclassFileForm(forms.Form):file=forms.FileField(#支持多文件上传widget=forms.ClearableFileInput(attrs={'multiple':True}),label='请选择文件',)
2-5 添加上传、下载路由 URL
为上传、下载功能添加路由 URL
#项目urls.pyfromdjango.contribimportadminfromdjango.urlsimportpath,includeurlpatterns=[path('admin/',admin.site.urls),path('',include('index.urls'))]#indexAppurls.pyfromdjango.urlsimportpathfrom.viewsimport*urlpatterns=[#上传path('',index_view,name='index'),#下载path('download/
2-6 编写模板文件
在 index App 的模板文件夹创建一个简单的模板文件upload.html
其中
form 代表视图函数传过来的表单实体对象
form.as_p 代表以字段格式渲染所有的表单元素
#indexAppupload.html