文章目录

  • 一.模型继承
    • 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的边边角角(一):模型继承、静态资源、文件上传相关推荐

  1. Django(文件上传+分页+表单)

    一.文件上传 form表单中需要添加 enctype="multipart/form-data" 1.media: 文件上传的文件 在settings.py 文件中配置:MEDIA ...

  2. 自学Python第二十二天- Django框架(三) AJAX、文件上传、POST 请求类型之间的转换、多APP开发、iframe、验证码、分页器、类视图、中间件、信号、日志、缓存、celery异步

    Django官方文档 django 使用 AJAX django 项目中也可以使用 ajax 技术 前端 前端和其他 web 框架一样,需要注意的是,django 接收 POST 请求时,需要 csr ...

  3. django文件上传

    Django在处理文件上传时,文件数据被打包封装在request.FILES中. 一.简单上传 首先,写一个form模型,它必须包含一个FileField: # forms.py from djang ...

  4. 上传文件和提交textfield_0基础掌握Django框架(37)文件上传

    为了更好的学习效果,请搭配视频教程一起学习: Django零基础到项目实战 - 网易云课堂​study.163.com 文件上传: 文件上传是网站开发中非常常见的功能.这里详细讲述如何在Django中 ...

  5. django 1.8 官方文档翻译: 3-3-1 文件上传

    文件上传 当Django在处理文件上传的时候,文件数据被保存在request. FILES (更多关于 request 对象的信息 请查看 请求和响应对象).这篇文档阐述了文件如何上传到内存和硬盘,以 ...

  6. Django后台管理系统 文章相片视频文件上传 前端页面

    Django后台管理系统 文章相片文件上传 如需安装运行环境或远程调试,见文章底部个人QQ名片,由专业技术人员远程协助! 前言 这篇博客针对<<Django后台管理系统 文章相片文件上传& ...

  7. django文件上传到服务器,django上传文件的三种方式

    Django文件上传需要考虑的重要事项 文件或图片一般通过表单进行.用户在前端点击文件上传,然后以POST方式将数据和文件提交到服务器.服务器在接收到POST请求后需要将其存储在服务器上的某个地方.D ...

  8. django 快速实现文件上传

    对于web开来说,用户登陆.注册.文件上传等是最基础的功能,针对不同的web框架,相关的文章非常多,但搜索之后发现大多都不具有完整性,对于想学习web开发的新手来说就没办法一步一步的操作练习:对于we ...

  9. Django实现任意文件上传(最简单的方法)

    利用Django实现文件上传并且保存到指定路径下,其实并不困难,完全不需要用到django的forms,也不需要django的models,就可以实现,下面开始实现. 第一步:在模板文件中,创建一个f ...

最新文章

  1. word2vec代码_TensorFlow2.0 代码实战专栏(四):Word2Vec (Word Embedding)
  2. RocketMQ源码:Broker启动过程介绍
  3. 诺基亚5800WIFI设置教程
  4. windows7 删除hiberfil.sys文件的方法
  5. python学了基础之后方向_学习了解python基础后,该进去哪一个方向呢?
  6. C# 利用反射动态创建对象[摘录]
  7. 金电容(法拉电容)与可充放电池的相关知识
  8. github视频教程-03 如何使用github上pull-request功能(VS2013)
  9. .NET开发必看资料53个+经典源码77个(转)
  10. cad2020打印样式放在哪个文件夹_CAD批量打印、DPF合成(建议收藏)
  11. [OpenGL] 非真实感渲染(NPR)的几种效果demo(水墨画/漫画/铅笔画)
  12. Autodesk AutoCAD 2019.1.2下载和安装 + CAD视频教程一套
  13. bazel 的安装与卸载
  14. MeterSphere与云效DevOps集成
  15. 素描滤镜_您可能不知道的素描技巧和键盘快捷键
  16. 网络对抗技术—实验报告一
  17. 树莓派魔镜php,用树莓派和显示器制作一面“魔镜”
  18. 数据库的这些你都知道吗?
  19. mysql的启动命令_mysql的配置和启动命令
  20. 化学结构命名软件对比

热门文章

  1. 【Java面试高频-多线程】- 三个线程分别负责打印A,B和C,循环100次
  2. 在手机上安装linux系统
  3. 独热编码(One-Hot)及其代码
  4. LeetCode 784. 字母大小写全排列
  5. 搜狗并入腾讯幕后:核心高管只余一人,PCG全力备战字节
  6. .Net Core下自定义JsonResult
  7. 没用东西全部清掉_魔域手游怎样清理背包?没用的东西都丢掉!
  8. Python 图片合并 pdf
  9. 【华为云技术分享】自动驾驶网络系列四:我们谈自动驾驶网络到底在谈什么?
  10. FBX格式解析顶点信息和用OpenGL显示