Django的边边角角(一):模型继承、静态资源、文件上传
文章目录
- 一.模型继承
- 1.概述
- 2.模型创建
- 二.静态资源
- 1.静态资源和模板的区别
- 2.注意
- 三.文件上传
- 1.源码实现
- 2.Django文件上传
- 3.显示图片
一.模型继承
1.概述
默认一个模型在数据库中映射一张表
如果模型存在继承的时候,父模型产生表映射
子模型对应的表会通过外键和父表产生关联
从表外键引用主表得主键
不能说从表外键引用主表的主键就一定是模型继承,因为一对一、一对多,都会引用主表的主键
关系型数据库性能
数据量越大性能越低
关系越多越复杂越低性能越低
2.模型创建
class Dog(Animal):name = models.CharField(max_length=32)type = models.CharField(max_length=16)class Meta:db_table = 'dog'class Cat(Animal):name = models.CharField(max_length=32)color = models.CharField(max_length=16)class Meta:db_table = 'cat'
上面创建模型时,有重复的属性,当有重复的属性的时候,我们应该想到模型的继承。
# 模型继承的意思,就是公用某一些属性,但是并不是想降低效率
class AnimalModel(models.Model):name = models.CharField(max_length=32)class Meta:abstract = Trueclass Dog(AnimalModel):type = models.CharField(max_length=16)class Meta:db_table = 'dog'class Cat(AnimalModel):color = models.CharField(max_length=16)class Meta:db_table = 'cat'
创建主路由:
url(r'^com/',include('ComApp.urls')),
创建子路由:
url(r'^addDog/',views.addDog),url(r'^addCat/',views.addCat),
生成视图函数:
def addDog(request):dog = Dog()dog.type = '二哈'dog.name = '哈王'dog.save()return HttpResponse('添加小狗成功')def addCat(request):cat = Cat()cat.color = '白色'cat.name = '秀秀'cat.save()return HttpResponse('添加小猫成功')
运行结果:
抽象模型
在父类的Model的元信息中添加 abstract=True
class Meta:
abstract=True
抽象的模型不会在数据库中产生表
子模型拥有父模型中的所有字段
二.静态资源
1.静态资源和模板的区别
(1)模板的路径不可以直接访问,必须通过请求来访问
static资源可以直接访问
创建子路由:
url(r'^testTem/',views.testTem),
生成视图函数:
def testTem(request):return render(request,'testTem.html')
创建模板:
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>欢迎来到英雄联盟
</body>
</html>
运行结果:
若直接访问:
创建static包,创建testStatic页面:
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>欢迎来到王者荣耀
</body>
</html>
在settings.py文件中进行static配置:
STATICFILES_DIRS = [os.path.join(BASE_DIR,'static')
]
运行结果:
(2)模板的语法不可以在静态资源中书写
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>欢迎来到王者荣耀{% for foo in fuc %}{% endfor %}
</body>
</html>
运行结果:
2.注意
(1)使用的时候注意先配置资源位置:
STATICFILES_DIRS = [os.path.join(BASE_DIR,'static')
]
使用 {% load static %}
{% static ‘相对路径’ %}
使用详情请看我之前的博文:Django模板中的加载静态资源
(2)全栈工程师:要求会templates
开发工程师:前后端分离static
三.文件上传
要求:客户端必须使用POST指定enctype='multiplepart/form-data'
1.源码实现
修改主路由:
url(r'^com/',include('ComApp.urls',namespace='com')),
创建子路由:
url(r'^testUpload/',views.testUpload,name='testUpload'),
生成视图函数:
def testUpload(request):if request.method == 'GET':return render(request,'testUpload.html')elif request.method == 'POST':icon = request.FILES.get('icon')return HttpResponse('上传成功'
创建testUpload.html模板:
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body><h1>上传图片</h1><form action="{% url 'com:testUpload' %}" method="post" enctype="multipart/form-data">{% csrf_token %}<input type="file" name="icon"><button>上传</button></form>
</body>
</html>
运行结果:
接下来设置文件存放位置:
在static下创建upload包放置一张图片:
视图函数:
def testUpload(request):if request.method == 'GET':return render(request,'testUpload.html')elif request.method == 'POST':icon = request.FILES.get('icon')# 因为我们使用的是windows连接的远程服务器,那么这个时候就不可以使用绝对路径# 绝对路径windows和centos的路径不一致,上传或者下载的路径就都不对,所以如果使用的是远程服务器,那么就要写相对路径with open('static/upload/1.jpg','wb')as fp:for part in icon.chunks():fp.write(part)# 103个字节# 针对文件操作,默认with open是自带close的# 原来是close中封装了flush方法,但是现在文件操作中,已经没有flush方法了,因为close方法中只有passfp.flush()return HttpResponse('上传成功')
重新上传新的文件:
2.Django文件上传
创建子路由:
url(r'^testDjangoUpload/',views.testDjangoUpload,name="testDjangoUpload"),
创建模型:
class User(models.Model):u_name = models.CharField(max_length=32)u_icon = models.ImageField(upload_to='%Y/%m/%d/icons')class Meta:db_table = 'user'
生成视图函数:
def testDjangoUpload(request):if request.method == 'GET':return render(request,'testDjangoUpload.html')elif request.method == 'POST':icon = request.FILES.get('icon')user = User()user.u_name = '动漫人物'user.u_icon = iconuser.save()return HttpResponse('上传成功')
在settings中设置MEDIA_ROOT:
MEDIA_ROOT = os.path.join(BASE_DIR,'static/uploadDjango')
创建模板:
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body><h1>django的文件上传</h1><form action="{% url 'com:testDjangoUpload' %}" method="post" enctype="multipart/form-data">{% csrf_token %}<input type="file" name="icon"><button>上传</button></form>
</body>
</html>
运行结果:
出现上面的错误是没有安装pillow,我们需进行安装:pip install pillow,再次运行:
点击前:
点击后:
Django的文件上传步骤:
1 执行一个请求,跳转到一个页面
2 页面中的请求方式是post,然后设置enctype
3 在settings中设置MEDIA_ROOT: os.path.join(BASE_DIR,‘static/自定义文件夹名字’)
4 创建一个模型,模型中一个属性的类型是imageFiled,该属性的约束是upload_to
注意imageFiled依赖于pillow,必须安装,如果你的django版本自动添加了pillow,就不需要安装
注意文件图片保存的位置是MEDIA_ROOT和upload_to的拼接
5 实例化对象,保存即可
注意:
1:重复添加同一个图片,那么会直接添加进去,文件的名字是文件名原名+唯一串
2:数据库icon的值是upload_to + 文件名字
隐藏bug:linux系统下文件夹的第一级子目录下,最多存储65535个文件
解决方案:u_icon = models.ImageField(upload_to=’%Y/%m/%d/icons’)
支持时间格式化:%Y%m%d%H%M%S
3.显示图片
创建子路由:
url(r'^getImage/',views.getImage),
生成视图函数:
def getImage(request):user = User.objects.last()context = {'icon':user.u_icon}return render(request,'getImage.html',context=context)
创建模板:
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title><style>img{width: 80px;height: 80px;border-radius: 50%;}</style>
</head>
<body><img src="/static/uploadDjango/{{ icon }}" alt="">
</body>
</html>
运行结果:
Django的边边角角(一):模型继承、静态资源、文件上传相关推荐
- Django(文件上传+分页+表单)
一.文件上传 form表单中需要添加 enctype="multipart/form-data" 1.media: 文件上传的文件 在settings.py 文件中配置:MEDIA ...
- 自学Python第二十二天- Django框架(三) AJAX、文件上传、POST 请求类型之间的转换、多APP开发、iframe、验证码、分页器、类视图、中间件、信号、日志、缓存、celery异步
Django官方文档 django 使用 AJAX django 项目中也可以使用 ajax 技术 前端 前端和其他 web 框架一样,需要注意的是,django 接收 POST 请求时,需要 csr ...
- django文件上传
Django在处理文件上传时,文件数据被打包封装在request.FILES中. 一.简单上传 首先,写一个form模型,它必须包含一个FileField: # forms.py from djang ...
- 上传文件和提交textfield_0基础掌握Django框架(37)文件上传
为了更好的学习效果,请搭配视频教程一起学习: Django零基础到项目实战 - 网易云课堂study.163.com 文件上传: 文件上传是网站开发中非常常见的功能.这里详细讲述如何在Django中 ...
- django 1.8 官方文档翻译: 3-3-1 文件上传
文件上传 当Django在处理文件上传的时候,文件数据被保存在request. FILES (更多关于 request 对象的信息 请查看 请求和响应对象).这篇文档阐述了文件如何上传到内存和硬盘,以 ...
- Django后台管理系统 文章相片视频文件上传 前端页面
Django后台管理系统 文章相片文件上传 如需安装运行环境或远程调试,见文章底部个人QQ名片,由专业技术人员远程协助! 前言 这篇博客针对<<Django后台管理系统 文章相片文件上传& ...
- django文件上传到服务器,django上传文件的三种方式
Django文件上传需要考虑的重要事项 文件或图片一般通过表单进行.用户在前端点击文件上传,然后以POST方式将数据和文件提交到服务器.服务器在接收到POST请求后需要将其存储在服务器上的某个地方.D ...
- django 快速实现文件上传
对于web开来说,用户登陆.注册.文件上传等是最基础的功能,针对不同的web框架,相关的文章非常多,但搜索之后发现大多都不具有完整性,对于想学习web开发的新手来说就没办法一步一步的操作练习:对于we ...
- Django实现任意文件上传(最简单的方法)
利用Django实现文件上传并且保存到指定路径下,其实并不困难,完全不需要用到django的forms,也不需要django的models,就可以实现,下面开始实现. 第一步:在模板文件中,创建一个f ...
最新文章
- word2vec代码_TensorFlow2.0 代码实战专栏(四):Word2Vec (Word Embedding)
- RocketMQ源码:Broker启动过程介绍
- 诺基亚5800WIFI设置教程
- windows7 删除hiberfil.sys文件的方法
- python学了基础之后方向_学习了解python基础后,该进去哪一个方向呢?
- C# 利用反射动态创建对象[摘录]
- 金电容(法拉电容)与可充放电池的相关知识
- github视频教程-03 如何使用github上pull-request功能(VS2013)
- .NET开发必看资料53个+经典源码77个(转)
- cad2020打印样式放在哪个文件夹_CAD批量打印、DPF合成(建议收藏)
- [OpenGL] 非真实感渲染(NPR)的几种效果demo(水墨画/漫画/铅笔画)
- Autodesk AutoCAD 2019.1.2下载和安装 + CAD视频教程一套
- bazel 的安装与卸载
- MeterSphere与云效DevOps集成
- 素描滤镜_您可能不知道的素描技巧和键盘快捷键
- 网络对抗技术—实验报告一
- 树莓派魔镜php,用树莓派和显示器制作一面“魔镜”
- 数据库的这些你都知道吗?
- mysql的启动命令_mysql的配置和启动命令
- 化学结构命名软件对比