Django从理论到实战(part50)--使用模型来处理上传的文件
学习笔记,仅供参考,有错必纠
文章目录
- 使用模型来处理上传的文件
- `MEDIA_ROOT`和`MEDIA_URL`
- 限制文件的扩展名
使用模型来处理上传的文件
在定义模型的时候,我们可以给存储文件的字段指定为FileField
,这个Field
可以传递一个upload_to
参数,用来指定上传上来的文件保存到哪里。
比如,我们让文章保存到项目的work
文件夹下,其模型类为:
class Work(models.Model):team_group = models.CharField('组别', max_length = 30)work_name = models.CharField('项目名称', max_length = 50)add_time = models.DateTimeField(auto_now = True)paper = models.FileField("作品", upload_to = "paper")status = models.CharField('状态', max_length = 20, default="未审核")def __str__(self):return "作品名称:" + self.work_name
其视图函数为:
def testupload(request):if request.method == "GET":return render(request, "test_upload_paper.html")elif request.method == "POST":team_group = request.POST.get("team_group", "")work_name = request.POST.get("work_name", "")paper = request.FILES.get("paper", "")models.Work.objects.create(team_group = team_group,work_name = work_name,paper = paper)return HttpResponse("Success!")
urls.py文件:
from django.urls import path
from . import views
app_name = 'school'urlpatterns = [path('login/', views.mylogin, name = "slogin"),path('testupload/', views.testupload),
]
我们向http://127.0.0.1:8000/school/testupload/发起请求:
查看work/paper文件夹内的内容:
Very Well!
MEDIA_ROOT
和MEDIA_URL
设置MEDIA_ROOT
表示上传到服务器的文件要保存在哪里;
MEDIA_URL
表示如果我们要在浏览器中访问上传的文件,应该通过什么URL来访问。
我们在settings.py文件中指定MEDIA_ROOT
和MEDIA_URL
:
MEDIA_ROOT = os.path.join(BASE_DIR, 'work')
MEDIA_URL = '/work/'
同时,为了能在浏览器上直接访问静态文件,我们应该在urls.py中添加如下url:
from django.contrib import admin
from django.urls import path,include
from . import views
from django.conf.urls.static import static
from django.conf import settingsurlpatterns = [path('admin/', admin.site.urls),path('', views.mainIndex),
] + static(settings.MEDIA_URL,document_root=settings.MEDIA_ROOT)
现在,即使我们不在FileField
中传入upload_to
参数,文件也会自动保存在项目的work文件夹中,但是如果我们指定了upload_to
参数为'paper'
,那么文件就会上传到work/paper
目录下。
如果,我们指定upload_to
的参数为"%Y/%m/%d/"
,那么Django就会根据文件提交日期的不同,自动保存文件到对应日期的文件夹下。
限制文件的扩展名
如果想要限制上传的文件的拓展名,那么我们就需要用到表单来进行限制。我们可以使用普通的Form
表单,也可以使用ModelForm
,直接从模型中读取字段。
- 举个例子
models.py
class Work(models.Model):team_group = models.CharField('组别', max_length = 30)work_name = models.CharField('项目名称', max_length = 50)add_time = models.DateTimeField(auto_now = True)paper = models.FileField("作品", upload_to = "paper", validators = [validators.FileExtensionValidator(['doc', 'docx','pdf'],message = "必须为doc,docx,pdf格式的文件")])status = models.CharField('状态', max_length = 20, default="未审核")
forms.py
from django import forms
from .models import Workclass WorkForm(forms.ModelForm):def get_errors(self):errors = self.errors.get_json_data()new_errors = {}for key,message_dicts in errors.items():messages = []for message in message_dicts:messages.append(message['message'])new_errors[key] = messagesreturn new_errorsclass Meta:model = Workfields = ['work_name', 'paper']
views.py
def testupload(request):if request.method == "GET":return render(request, "test_upload_paper.html")elif request.method == "POST":workForm = forms.WorkForm(request.POST, request.FILES)#request.FILES用于验证paper#request.POST用于验证work_nameif workForm.is_valid():workForm.save()return HttpResponse("Success!")else:print(workForm.errors.get_json_data())return HttpResponse("Fail!")
向http://127.0.0.1:8000/school/testupload/发起请求:
传入不符合要求的文件:
得到错误信息:
Django从理论到实战(part50)--使用模型来处理上传的文件相关推荐
- Django从理论到实战(part51)--User模型
学习笔记,仅供参考,有错必纠 摘自:pink老师教案 文章目录 User模型 字段 User模型的基本用法 创建用户 创建超级用户 修改密码 登录验证 User模型 User模型是Django框架的核 ...
- Django从理论到实战(part27)--ORM模型的增删改查操作
学习笔记,仅供参考 参考自:Django打造大型企业官网–Huang Y: 本系列Blog以应用为主,理论基础部分我在后端专栏的Django系列博客已经写过了,如果有些需要补充的知识点,我会在这个系列 ...
- Django从理论到实战(part26)--ORM模型
学习笔记,仅供参考 参考自:Django打造大型企业官网–Huang Y: 本系列Blog以应用为主,理论基础部分我在后端专栏的Django系列博客已经写过了,如果有些需要补充的知识点,我会在这个系列 ...
- Django从理论到实战(part54)--MEDIA_ROOT和MEDIA_URL
学习笔记,仅供参考,有错必纠 引用:使用模型来处理上传的文件:Django static静态配置文件 MEDIA_ROOT和MEDIA_URL 变量解释 MEDIA_ROOT:指定用户上传文件的本地路 ...
- Django从理论到实战(part41)--WSGIRequest对象
学习笔记,仅供参考,有错必纠 参考自:Django打造大型企业官网–Huang Y: 文章目录 WSGIRequest对象 WSGIRequest对象常用属性 WSGIRequest对象常用方法 WS ...
- Django框架(上传Excel文件并读取)
博主今天整理下Django框架中上传Excel文件并读取 博主是要在管理平台中新增用例的维护功能,想着通过上传Excel文件来展示用例,下面是项目的路径图: 首先先建数据库模型 model.py 可以 ...
- django后台接收form-data 格式上传的文件
1,浏览器端端js程序 浏览器以from-data表单的格式上传文件. 2,django后端处理程序 接收来自浏览器上传的文件,并把文件存储在一指定的路径下. product_id = request ...
- Web项目,网页上传excel文件并解析实战示例
最近写了一个基于poi解析excel文件的工具类,所以想在web项目中测试一下,就做了这个简单的项目.本项目主要使用了 SpringMVC+RESTful+Maven的风格.适合有一定基础的人员. 源 ...
- Django从理论到实战(part55)--将网站上传到GitHub
代码笔记,仅供参考 文章目录 上传项目到GitHub 创建本地仓库 在GitHub上创建仓库 项目上传 上传项目到GitHub 创建本地仓库 我们在git bash中敲入如下代码. 进入项目目录: c ...
最新文章
- .Net IL代码研究
- [导入]★ 你知道JavaScript里数组的最大长度允许多少吗 ★
- 分享内容apd android,Appium - DesiredCapabilities对象的参数配置及含义
- php静态变量的销毁
- 能让你少写1000行代码的20个正则表达式
- Ruby 和 Python 分析器是如何工作的?
- 在两个Silverlight应用间数据通信(包括与Flash通信)
- java 取文本中间_Java 如何利用正则表达式提取两个指定标记符号之间的字符串内容...
- 敏捷与可靠:极米科技携手华为云,共同开启家庭娱乐新视界
- HTML示例06---段落(原格式标记)
- myeclipse 创建 maven项目的时候出现:invalid project description 解决方法
- 最新版盲盒商城thinkphp+uniapp
- 网络基础之TCP/IP五层模型
- matlab三相逆变电路仿真,matlab三相逆变电路设计与仿真介绍.doc
- 赋能未来的昆腾全新Scalar存储平台
- 服务器密码机的标准和产品应用要点
- c++直角空心三角形_八年级数学三角形专题知识点汇总,掌握了考满分!
- 育儿-《养育男孩》书中的精髓:父母如何理解男孩的每个成长阶段,更好地培养男孩?
- SpringSecurity之授权
- amp;#9733;电车难题的n个坑爹变种
热门文章
- python中文正则匹配初步使用
- 2.5 矩阵乘法规则
- ORA-01756: quoted string not properly terminated
- oracle11g 数据库导出报“ EXP-00003: 未找到段 (0,0) 的存储定义”错误的解决方案
- 在c++中使用for循环遍历map并删除map中的元素的注意事项
- Redis工具之Jedis
- 远程连接MySql数据库
- BZOJ2240 : ural1676 Mortal Combat
- 别放任这些小毛病不管!它会扩大还会造成重大危险
- linux下解压大于4G文件提示error: Zip file too big错误的解决办法