学习笔记,仅供参考,有错必纠


文章目录

  • 使用模型来处理上传的文件
    • `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_ROOTMEDIA_URL

设置MEDIA_ROOT表示上传到服务器的文件要保存在哪里;

MEDIA_URL表示如果我们要在浏览器中访问上传的文件,应该通过什么URL来访问。

我们在settings.py文件中指定MEDIA_ROOTMEDIA_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)--使用模型来处理上传的文件相关推荐

  1. Django从理论到实战(part51)--User模型

    学习笔记,仅供参考,有错必纠 摘自:pink老师教案 文章目录 User模型 字段 User模型的基本用法 创建用户 创建超级用户 修改密码 登录验证 User模型 User模型是Django框架的核 ...

  2. Django从理论到实战(part27)--ORM模型的增删改查操作

    学习笔记,仅供参考 参考自:Django打造大型企业官网–Huang Y: 本系列Blog以应用为主,理论基础部分我在后端专栏的Django系列博客已经写过了,如果有些需要补充的知识点,我会在这个系列 ...

  3. Django从理论到实战(part26)--ORM模型

    学习笔记,仅供参考 参考自:Django打造大型企业官网–Huang Y: 本系列Blog以应用为主,理论基础部分我在后端专栏的Django系列博客已经写过了,如果有些需要补充的知识点,我会在这个系列 ...

  4. Django从理论到实战(part54)--MEDIA_ROOT和MEDIA_URL

    学习笔记,仅供参考,有错必纠 引用:使用模型来处理上传的文件:Django static静态配置文件 MEDIA_ROOT和MEDIA_URL 变量解释 MEDIA_ROOT:指定用户上传文件的本地路 ...

  5. Django从理论到实战(part41)--WSGIRequest对象

    学习笔记,仅供参考,有错必纠 参考自:Django打造大型企业官网–Huang Y: 文章目录 WSGIRequest对象 WSGIRequest对象常用属性 WSGIRequest对象常用方法 WS ...

  6. Django框架(上传Excel文件并读取)

    博主今天整理下Django框架中上传Excel文件并读取 博主是要在管理平台中新增用例的维护功能,想着通过上传Excel文件来展示用例,下面是项目的路径图: 首先先建数据库模型 model.py 可以 ...

  7. django后台接收form-data 格式上传的文件

    1,浏览器端端js程序 浏览器以from-data表单的格式上传文件. 2,django后端处理程序 接收来自浏览器上传的文件,并把文件存储在一指定的路径下. product_id = request ...

  8. Web项目,网页上传excel文件并解析实战示例

    最近写了一个基于poi解析excel文件的工具类,所以想在web项目中测试一下,就做了这个简单的项目.本项目主要使用了 SpringMVC+RESTful+Maven的风格.适合有一定基础的人员. 源 ...

  9. Django从理论到实战(part55)--将网站上传到GitHub

    代码笔记,仅供参考 文章目录 上传项目到GitHub 创建本地仓库 在GitHub上创建仓库 项目上传 上传项目到GitHub 创建本地仓库 我们在git bash中敲入如下代码. 进入项目目录: c ...

最新文章

  1. .Net IL代码研究
  2. [导入]★ 你知道JavaScript里数组的最大长度允许多少吗 ★
  3. 分享内容apd android,Appium - DesiredCapabilities对象的参数配置及含义
  4. php静态变量的销毁
  5. 能让你少写1000行代码的20个正则表达式
  6. Ruby 和 Python 分析器是如何工作的?
  7. 在两个Silverlight应用间数据通信(包括与Flash通信)
  8. java 取文本中间_Java 如何利用正则表达式提取两个指定标记符号之间的字符串内容...
  9. 敏捷与可靠:极米科技携手华为云,共同开启家庭娱乐新视界
  10. HTML示例06---段落(原格式标记)
  11. myeclipse 创建 maven项目的时候出现:invalid project description 解决方法
  12. 最新版盲盒商城thinkphp+uniapp
  13. 网络基础之TCP/IP五层模型
  14. matlab三相逆变电路仿真,matlab三相逆变电路设计与仿真介绍.doc
  15. 赋能未来的昆腾全新Scalar存储平台
  16. 服务器密码机的标准和产品应用要点
  17. c++直角空心三角形_八年级数学三角形专题知识点汇总,掌握了考满分!
  18. 育儿-《养育男孩》书中的精髓:父母如何理解男孩的每个成长阶段,更好地培养男孩?
  19. SpringSecurity之授权
  20. amp;#9733;电车难题的n个坑爹变种

热门文章

  1. python中文正则匹配初步使用
  2. 2.5 矩阵乘法规则
  3. ORA-01756: quoted string not properly terminated
  4. oracle11g 数据库导出报“ EXP-00003: 未找到段 (0,0) 的存储定义”错误的解决方案
  5. 在c++中使用for循环遍历map并删除map中的元素的注意事项
  6. Redis工具之Jedis
  7. 远程连接MySql数据库
  8. BZOJ2240 : ural1676 Mortal Combat
  9. 别放任这些小毛病不管!它会扩大还会造成重大危险
  10. linux下解压大于4G文件提示error: Zip file too big错误的解决办法