Django 框架的应用

<!doctype html> <html> <head> <meta charset='UTF-8'><meta name='viewport' content='width=device-width initial-scale=1'> <title>python</title></head> <body><h1>day01:</h1> <h2>5.框架</h2> <h4>1.什么是框架?</h4> <p>​ 框架是一个为了解决某些开放性问题二存在的一种结构。</p> <h4>2.框架的优点</h4> <p>​ 1.快速开发</p> <p>​ 2.解决大部分通过问题</p> <p>​ 3.bug少,稳定性高</p> <h4>3.框架的分类</h4> <h5>1.前端框架</h5> <p>​ 处理(html,css,js)</p> <h5>2.后端框架</h5> <p>​ ssh, ssm -----java</p> <h5>3.全栈框架</h5> <p>​ 包含web整体的解决方案,如:开发框架,运行环境,处理方案</p> <p>​ spring,</p> <p>​ rails(Ruby),</p> <p>​ django(python)</p> <h5>4.python web</h5> <p>​ 1.Django: 重量级的python web 框架</p> <p>​ 2.Tornado: python web异步处理框架</p> <p>​ 3.Flask: 轻量级</p> <p>​ 4.webpy: 轻量级</p> <p>​ 5.web2py: 全栈框架,webpy 的加强版</p> <p>​ 在虚拟环境中安装</p> <p>​ pip install Django</p> <p>​ Pillow</p> <p>​ PyMySQL </p> <h1>day02:</h1> <h4>1.框架模式</h4> <p>​ 常用的框架模式:MVC、ORM、MVVM、MTV</p> <h5>1.MVC</h5> <p>​ M: models 模型 对数据库操作</p> <p>​ V: Views 视图 对HTML操作</p> <p>​ C: Controller 控制器 交互</p> <h5>2.MTV</h5> <p>​ M: Models 模型 对数据库操作CRUD</p> <p>​ T: Templates 模板 对HTML操作</p> <p>​ V: Views 视图 交互</p> <h4>2.Django框架</h4> <h5>1.什么是Django框架</h5> <p>​ 是一个开源框架,在2005年发布,早起用来开发新闻类网站;</p> <h5>2.Django优点</h5> <p>​ 1.开源,有完美的文档支持</p> <p>​ 2.解决方案多,内部功能强大</p> <p>​ 3.提供了完整的路由系统</p> <p>​ 4.自助式后台管理</p> <h5>3.Django的安装</h5> <p>​ 1.Linux中的安装</p> <p>​ 1.查看已安装的Django</p> <p>​ 1.进入虚拟环境</p> <p>​ 2.进入python交互模式下</p> <p>​ 3.在交互模式中数据</p> <p>​ 1.import Django</p> <p>​ 无反应,已经安装好</p> <p>​ 报错:环境中没有Django</p> <p>​ 2.Django.VERSION 查看版本</p> <p>​ 2.安装Django</p> <p>​ 1.在线安装 ----pip</p> <p>​ 1.pip install Django==1.11.8</p> <p>​ 2.离线安装</p> <p>​ 1.下载所需要的Django包</p> <p>​ <a href='http://www.djangoproject.com' target='_blank' class='url'>http://www.djangoproject.com</a></p> <p>​ download </p> <p>​ 2.在Linux中解压Django包</p> <p>​ tar -xvf Django-1.11.8.tar.gz</p> <p>​ 3.进入到Django-1.11.8中</p> <p>​ python setup.py install</p> <p>​ 2.在Windows中安装</p> <p>​ 1.在线安装</p> <p>​ pip install Django</p> <h5>4.Django使用</h5> <p>​ 1.创建Django项目</p> <p>​ django-admin.py startproject 项目名</p> <p>​ 点击创建Django项目按钮</p> <p>​ 2.通过manage.py 启动</p> <p>​ python manage.py runserver</p> <p>​ 3.python manage.py runserver 0.0.0.0:8000</p> <h5>5.Django 的结果介绍</h5> <p>​ 1.manage.py 文件</p> <p>​ 负责执行Django中的各项目操作的文件</p> <p>​ 如: </p> <p>​ 启动服务</p> <p>​ 创建应用</p> <p>​ 创建管理员,创建用户</p> <p>​ 2.主文件夹中的内容</p> <p>​ 1.<strong>init</strong>.py</p> <p>​ 项目初始化文件,每当启动项目时,自动执行</p> <p>​ 有初始化文件,放在此处</p> <p>​ 2.setting.py(重要文件)</p> <p>​ 项目的主配置文件</p> <p>​ 1.BASE_DIR:项目所在地绝对路径 2.DEBUG:调试模式 开发过程中,推荐使用True 上线运行时,推荐使用False 3.ALLOWED_HOSTS 如果不设置,只有本季能访问 通常推荐为“*” 4.INSTALLED_APPS 指定安装的应用 5.MIDDLEWARE:指定中间 6.ROOT-URLCONF:指定项目的基础路由配置文件 7.TEMPLATES:指定模板信息 8.DATABASES:制定数据库信息 9.LANGUGE_CODE:指定语言</p> <p>​ 3.urls.py</p> <p>​ 项目路由配置文件</p> <p>​ 路由:去哪找执行文件</p> <p>​ 4.wsgi.py</p> <p>​ 应用服务器配置,暂时不用</p> <p>​ 5.URL使用</p> <p>​ 1.urls.py </p> <p>​ 默认自主文件下,包含所有请求地址到视图的映射</p> <p>​ 2.测试URL和视图</p> <p>​ 1.在项目主文件夹创建views.py </p> <p>​ 作用:包含所有定义好的视图</p> <p>​ views.py</p> <p>​ from django.urls import path</p> <p>​ from django.http import HttpResponse</p> <p>​ 2.在urls.py里面追加</p> <p>​ from .views import *</p> <p>​ </p> <p>​ 3.url 函数</p> <p>​ url 函数语法</p> <p>​ url(regex,views,kwargs=None,name=None)</p> <p>​ 1.regex </p> <p>​ 正则表达式,匹配请求的url</p> <p>​ 2.views</p> <p>​ URL 处理的视图函数,自定义</p> <p>​ 3.kwargs</p> <p>​ 字典,向views传参时使用</p> <p>​ 4.name</p> <p>​ 字符串,给url起一个别名,在模板中使用</p> <p>​ 4.通过url向views传参</p> <p>​ from django.conf.urls import url</p> <p>​ url(r&#39;^index/(\d{4})/(\d{2})/(\d{2})/$&#39;,index_views)</p> <p>​ <a href='http://localhost:8000/index/2018/07/11' target='_blank' class='url'>http://localhost:8000/index/2018/07/11</a></p> <p>​ 联系访问:</p> <p>​ 1.访问地址:</p> <p>​ localhost:8000/zs/1989</p> <p>​ localhost:8000/ls/1999</p> <p>​ 2.访问地址:</p> <p>​ localhost:8000</p> <p>​ 返回:欢迎访问主页</p> <p>​ 5.用字典传参</p> <p>​ {&#39;name&#39;:&#39;sss&#39;,&#39;age&#39;:&#39;20&#39;}</p> <h4>3.Django 应用</h4> <h5>1.什么是应用?</h5> <p>​ 应用就是网站中的独立模块</p> <h5>2.创建应用</h5> <p>​ 1.命令</p> <p>​ ./manage.py startapp 应用名称</p> <p>​ 2.在setting.py 中注册应用</p> <p>​ INSTALLED_APPS=[</p> <p>​ ...........</p> <p>​ &#39;应用名称&#39;,</p> <p>​ ]</p> <h5>3.应用的结构</h5> <p>​ 1.migrations 目录</p> <p>​ 存放在数据库日志,是一个Django与数据库交互的中间件</p> <p>​ 2.<strong>init</strong>.py</p> <p>​ 应用的后台管理文件</p> <p>​ 3.admin.py</p> <p>​ 应用的后台管理配置文件</p> <p>​ 4.app.py</p> <p>​ 应用的属性配置文件,不需要改动</p> <p>​ 5.models.py </p> <p>​ Models模型文件</p> <p>​ 6.tests.py</p> <p>​ 测试模块,不需要改动</p> <p>​ 7.views.py </p> <p>​ 定义视图的文件</p> <p>​ 练习:</p> <p>​ 1.创建应用并注册</p> <p>​ 1.index</p> <p>​ 2.news</p> <p>​ 3.music</p> <p>​ 2.配置路由</p> <p>​ 1.localhost:8000/index/index</p> <p>​ 交给index应用中的login_views 处理</p> <p>​ 2.localhost:8000/index/news</p> <p>​ 交给news应用中的index_views 处理</p> <p>​ localhost:8000/index/news</p> <p>​ 交给news应用中的login_views 处理 </p> <p>​ 3.localhost:8000/index/music</p> <p>​ 交给music应用中的index_views 处理</p> <p>​ localhost:8000/index/music</p> <p>​ 交给news应用中的login_views 处理</p> <h5>4.Django应用</h5> <h5>5.Django中的模板</h5> <p>​ 1.什么是模板?</p> <p>​ 就是一个网页,可被视图相应给用户</p> <p>​ 2.模板设置</p> <p>​ 在setting中的TEPLATES变量</p> <p>​ 1.BACKEND:指定模板的搜索引擎,不用改</p> <p>​ 2.DIRS:指定模板所存在的目录们</p> <p>​ DIRS:[&#39;index.temp&#39;,&#39;news.temp&#39;]</p> <p>​ 推荐:DIRS为空</p> <p>​ 2.在每个应用下创建贴膜拉特色文件夹,存放所有网页</p> <p>​ 3.APP_DIRS</p> <p>​ True:先从DIRS中指定的文件夹中查找模板,如果没有找到,在搜索名为templates的文件夹 </p> <p>​ 3.模板的加载方式</p> <p>​ 1.使用loader获取模板,通过Httpresponse进行响应</p> <p>​ from django.template import loader</p> <p>​ def XXX_views(request):</p> <p>​ t = loader.get_template(&#39;xxx.html&#39;)</p> <p>​ html = t.reader({}) </p> <p>​ return HttpResponse(html)</p> <p>​ 2.使用render或者render_to_response直接加载</p> <p>​ 1.render</p> <p>​ return render(request,‘网页’,{})</p> <p>​ 2.render_to_response</p> <p>​ 可能被放弃</p> <p>​ 4.url()中的第四个参数</p> <p>​ name:定义url的别名,允许在template中使用别名来访问url</p> <p>​ 在模板中,使用 name 加载</p> <p>​ <a href="{% url 'name别名'%}"></a>通过别名访问路径</p> <h4>作业:</h4> <p>​ 1.创建项目名字叫 fruitday</p> <p>​ 2.创建应用 index</p> <p>​ 3.配置 主路由配置 和 index 应用路由配置</p> <p>​ 1.访问 localhost:8000</p> <p>​ 交给index应用中 index_views 处理</p> <p>​ 2.访问localhost:8000:login </p> <p>​ 交给index应用中 login_views 处理</p> <p>​ 3.访问 localhost:8000/register 处理</p> <p>​ 交给index应用中register 处理</p> <h1>day03:</h1> <h5>5.模板的语法</h5> <p>​ 作用:允许将后端的数据传递给模板,在模板中显示实际变量的值</p> <p>​ 在Django中允许传递给模板作为变量的类型</p> <p>​ 数字,字符,列表,元组,字典,函数,对象</p> <p>​ 如何将变量传到模板中:</p> <p>​ 1.使用render加载模板</p> <p>​ dic = {</p> <p>​ ‘变量’:‘值’, </p> <p>​ }</p> <p>​ return render(request,&#39;&#39;,dic)</p> <p>​ 2.使用loader加载模板</p> <p>​ t = loader.get_template(&#39;xx.html&#39;)</p> <p>​ html = t.render(dic)</p> <p>​ return HttpResponse(html)</p> <p>​ 如何在模板中获取变量的值:</p> <p>​ {{变量名}}</p> <h4>2.标签</h4> <p>​ 1.什么是标签,</p> <p>​ 允许嵌套一些服务器基本逻辑运算到模板中</p> <p>​ 2.语法</p> <p>​ {%%}</p> <p>​ 3.常用标签</p> <p>​ 1.{% if %}...{% endif %}</p> <p>​ 2.{% if %}...{% else%}...{% endif %}</p> <p>​ 3.{% ifequal %}...{% endifequal %}</p> <p>​ 4.{% for 变量 in 列表|元组 %}</p> <p>​ {{变量}}</p> <p>​ {% endfor %}</p> <p>​ 允许使用内置变量(免声明)</p> <p>​ 变量:forloop</p> <p>​ 属性: </p> <p>​ 1.forloop:counter: 记录当前循环的次数</p> <p>​ 2.forloop:counter0: 同上从0开始</p> <p>​ 3.forloop:revcounter: 记录未被遍历的数量</p> <p>​ 4.forloop:first: 布尔值标记是否第一个项目</p> <p>​ 5.forloop:last: 布尔值,标记为最后一个项目</p> <h4>3.过滤器</h4> <p>​ 1.作用:</p> <p>​ 在显示变量中,允许对数据进行筛选或改变</p> <p>​ 2.语法</p> <p>​ {{ var | 过滤器}}</p> <p>​ 3.常用过滤器</p> <p>​ 1.{{var | upper}}</p> <p>​ 将var的数据变为全大写</p> <p>​ 2.{{var | lower}}</p> <p>​ 将var的数据变为全小写</p> <p>​ 3.{{var | floatformat:n}}</p> <p>​ 将var四舍五入到n为小数</p> <h4>5.模板继承</h4> <h5>1.模板的继承</h5> <p>​ 当多个模板具备相同的内容时,就可以使用继承的方式来简化代码的开发 当子模板继承父模板后,子模板会具备模板中所有的内容,并且可以修改或增加属于自己的内容</p> <h5>2.模板继承的语法</h5> <p>​ 1.在父模板中 增加{%block 名称%}....{%endblock%} 在block中定义的是正常显示在父模板中但允许被子模板修改的内容</p> <p>​ 在父模板中{%block 名称%}...{%endblock%}允许出现若干个</p> <p>​ 2.在 子模板 中 1.在最顶层的第一句话增加 {%extends &#39;父模板的名称&#39;%} 2.增加block标记, 编写属于自己的内容 {%block 名称%}   ... {%endblock%}</p> <h1>day04:</h1> <h4>1.模型-models</h4> <h5>1.什么是模型?</h5> <p>​ 按照数据库表结果来抽象出来的class在数据库中,可以完成对数据的CRUD</p> <p>​ C: create </p> <p>​ R: retrieve</p> <p>​ U: update</p> <p>​ D: delete</p> <h5>2.创建 和 使用模型 - ORM</h5> <p>​ 1.什么是ORM?</p> <p>​ 中文:对象关系映射</p> <p>​ 三大特征:</p> <p>​ 1.数据表 到 类 映射</p> <p>​ 允许将表自动生成一个class,也允许将类对应的自动生成表</p> <p>​ 2.数据类型的映射</p> <p>​ 允许将表中的字段自动生成到编程语言中 的属性,并能够将表中的字段的数据</p> <p>​ 类型,也对应生成到编程语言中对应数据类型</p> <p>​ 3.关系映射</p> <p>​ 数据库的关联关系:</p> <p>​ 一对一</p> <p>​ 一对多</p> <p>​ 多对多</p> <p>​ 将表中的关联关系也映射到编程语言的class,通过创建对象的关系来完成映射</p> <p>​ 2.ORM的优点</p> <p>​ 1.提高了开发效率,能够自动完成class到table的映射或者table到class的映射,可以在程</p> <p>​ 序中省略庞大的数据访问层</p> <p>​ 2.不用编写SQL,也能完成岁数据的CRUD操作</p> <h5>3.创建 和 配置 数据库</h5> <p>​ 1.数据库创建</p> <p>​ create database webdb default charset utf8</p> <p>​ 2.Django中数据库配置</p> <p>​ 在setting中配置数据库信息</p> <p>​ DATABASES = {</p> <p>​ &#39;default&#39;: {</p> <p>​ &#39;ENGINE&#39;: &#39;django.db.backends.mysql&#39;, </p> <p>​ &#39;NAME&#39;: &#39;webdb&#39;,</p> <p>​ &#39;USER&#39;:&#39;root&#39;,</p> <p>​ &#39;PASSWORD&#39;:&#39;mysql&#39;,</p> <p>​ &#39;HOST&#39;:&#39;localhost&#39;, </p> <p>​ &#39;PORT&#39;:&#39;3306&#39;</p> <p>​ }</p> <p>​ }</p> <p>​ 1.ENGINE:引擎</p> <p>​ 连接MySQL的引擎django.db.backends.mysql</p> <p>​ 2.NAME:要连接的 数据库名</p> <p>​ 3.USER:用户名名称,通常都是root</p> <p>​ 4.PASSWORD:用户名密码:mysql</p> <p>​ 5.HOST:主机名</p> <p>​ 6.POST:端口号:3306</p> <h5>4.数据库的同步操作</h5> <p>​ 1. manage.py makemigrations</p> <p>​ 作用将每个应用下的models先映射成数据库的日志文件,并存放在每个应用下的migrations</p> <p>​ 文件中</p> <p>​ 若报错:</p> <p>​ 在主目录下的<strong>init</strong>.py</p> <p>​ import pymysql</p> <p>​ pymysql.install_as_MySQLdb()</p> <p>​ 2.manage.py migrate</p> <p>​ 作用:将每个应用下的migrations 文件夹中的日志文件同步到数据库</p> <h5>5.编写models</h5> <p>​ 1.注意</p> <p>​ 1.models中的每个class都成为模型类或者实体类</p> <p>​ 2.models中的每个实体类,必须继承自models。Model</p> <p>​ 2.创建模型类</p> <p>​ models.py</p> <p>​ from django.db import models</p> <p>​ class Publisher(models.Model):</p> <p>​ name = models.CharField(max_length= 30)</p> <p>​ address = models.CharField(max_length=50) </p> <p>​ city = models.CharField(max_length=30)</p> <p>​ country = models.CharField(max_length=30)</p> <p>​ website = models.URLField()</p> <h5>6.Django提供的数据字段 和 字段选项</h5> <p>​ 1.数据字段</p> <p>​ 1.BooleanField()</p> <p>​ 2.CharField()</p> <p>​ 3.DateField()</p> <p>​ 4.DecimalField()</p> <p>​ 5.EmailField()</p> <p>​ 6.FloatField()</p> <p>​ 7.fileField()</p> <p>​ 8.IntegerField()</p> <p>​ 9.ImageField()</p> <p>​ 10,URLField()</p> <p>​ 2.字段选项</p> <p>​ 1.null:是否允许为空</p> <p>​ name=models.CharField(max_length=30,null=True)</p> <p>​ 2.default:为列设置默认值</p> <p>​ name=models.CHarField(max_length=30,default=&#39;匿名&#39;)</p> <p>​ 3.verbose_name:在后台管理中,该列显示的名称</p> <p>​ name=models.CHarField(max_length=30,verbose_name=‘用户名称’)</p> <p>​ 练习:</p> <p>​ models.py 追加两个class</p> <p>​ 1.Auther -作者</p> <p>​ 1.name</p> <p>​ 2.age:IntegerField()</p> <p>​ 3.email:允许为空</p> <p>​ 2.Book -书籍</p> <p>​ 1.title:书名</p> <p>​ 2.publication——date: 出版日期</p> <h5>7.数据的导入和导出以及版本切换</h5> <p>​ 1.版本切换</p> <p>​ 1. ./manage.py migrate</p> <p>​ 执行最新的日志文件,同步到数据库</p> <p>​ 2. ./manage.py migrate 应用名 版本号</p> <p>​ ./manage.py migrate index 0001</p> <p>​ 2.数据库的导入和导出</p> <p>​ 1.数据的导出</p> <p>​ 1.导出所有的表结构和数据</p> <p>​ mysqldump -u root -p 数据库名 &gt; xx.sql</p> <p>​ 2.只导出表结构,不导出数据</p> <p>​ mysqldump -u root -p 数据库名 &gt; xxx.sql</p> <p>​ 2.导入数据</p> <p>​ mysql -u root -p 数据库名 &lt; xxx.sql</p> <p>​ 3.通过数据库自动导出models</p> <p>​ (将table映射成Models)</p> <p>​ ./manage.py inspectdb &gt; xx.sql</p> <h4>2.模型的数据库操作方法(CRUD)</h4> <h5>1.通过视图向DB中增加数据</h5> <p>​ 1.Entry.object.create(属性=值,属性=值)</p> <p>​ ex:</p> <p>​ Auther.object.create(</p> <p>​ name=&quot;老舍&quot;,age=&quot;50&quot;,email=&quot;<a href='mailto:1223@qq.com' target='_blank' class='url'>1223@qq.com</a>&quot;</p> <p>​ )</p> <p>​ 2.创建Models 类的对象,通过save()增加</p> <p>​ obj = Entry(属性=值,属性=值)</p> <p>​ obj .save()</p> <p>​ 3.通过字典创建Models类的对象,save()增加</p> <p>​ dic={</p> <p>​ &#39;属性&#39;:‘值’ </p> <p>​ }</p> <p>​ obj = Entry(**dic)</p> <p>​ obj .save()</p> <h5>2.通过视图查询数据</h5> <p>​ 所有的查询都要基于Entry.objects的基础上完成</p> <p>​ 1.查询接口</p> <p>​ 1.all()</p> <p>​ 语法:entry.objects.all()</p> <p>​ 返回:QuerySet - 查询结果</p> <p>​ sql :select * from Entry</p> <p>​ 2.values()</p> <p>​ 语法:entry.objects.all().value()</p> <p>​ 作用:Query Set</p> <p>​ ex:</p> <p>​ Author.objects.all().value(&#39;name&#39;,&#39;age&#39;)</p> <p>​ 3.order_by()</p> <p>​ 语法:Entry.objects.all().order_by(&#39;id&#39;)</p> <p>​ 作用:对查询结果集中的数据进行排序</p> <p>​ 返回:QuerySet</p> <p>​ ex:</p> <p>​ Author.objects.all().order_by(&#39;id&#39;)</p> <p>​ 所有数据按照id列的值升序排序</p> <p>​ Author.objects.all().order_by(&#39;-id&#39;)</p> <p>​ 所有数据按照id列的值降序排序</p> <p>​ 4.exclude()</p> <p>​ 语法:Entry.objects.exclude(属性=值)</p> <p>​ 作用:对指定条件取反</p> <p>​ 返回:QuerySet</p> <p>​ ex:</p> <p>​ 1.Author.objects.exclude(id=3)</p> <p>​ 2.Author.objects.exclude(id=3,age=50)</p> <p>​ 5.filter()</p> <p>​ 语法:Entry.objects.filter(条件)</p> <p>​ 作用:将满足条件的数据筛选出来</p> <p>​ 返回:QuerySet</p> <p>​ 6.get()</p> <p>​ 语法:Entry.objects.get(条件)</p> <p>​ 返回:一个models对象</p> <p>​ 注意:该函数只能返回一个对象,返回多个或没有查询到数据的话都抛出异常</p> <h3>作业:</h3> <p>​ 根据fruitday 中的login和register,分析天天果园中用户表的信息</p> <p>​ 1.创建数据库 FuritDay</p> <p>​ 2.创建模型类 - Models</p> <p>​ ...</p> <p>​ 增加一个字段,是否为活跃用户</p> <h1>day05:</h1> <p>&nbsp;</p> <p>​ 2.查询谓词</p> <p>​ 每个查询谓词都是一个条件,真正查询时会将谓词翻译成对应的条件语句</p> <p>​ 常用查询谓词</p> <p>​ 常用查询谓词:</p> <p>​ 1.__exact</p> <p>​ 作用:等值判断,等同于 =</p> <p>​ Author.objects.get(id_exact = 1)</p> <p>​ = Author.objects.get(id = 1)</p> <p>​ 2.lt、gt、gte、lte(前置双下滑线)</p> <p>​ 作用:数值比较</p> <p>​ Author.objects.filter(age__gt = 35) = age &gt; 35</p> <p>​ 3.__contains</p> <p>​ 作用:查询包含指令字符的</p> <p>​ Author.objects.filter(name__contains=&#39;元&#39;)</p> <p>​ select * from author where name like ‘%元%’</p> <p>​ 4.<strong>startwith,</strong>endwith</p> <p>​ 作用:查询指定字符作为开始/结束</p> <p>​ Auhtor .objects.filter(name__startwith=’霍‘)</p> <p>​ Author.objects.filter(name__endwith=&quot;真&quot;)</p> <h4>3.通过视图修改操作</h4> <h5>1.修改单个对象</h5> <p>​ 1.通过get()得到要修改的models对象</p> <p>​ 2.通过models对象直接修改数据即可</p> <p>​ 3.通过models对象的save()函数直接保存</p> <p>​ author = Author.objects.get(id=1)</p> <p>​ auhtor.name = &#39;爱新觉罗·康熙&#39;</p> <p>​ author.age = 200</p> <p>​ author.save()</p> <h5>2.批量修改</h5> <p>​ 调用QuerySet的update()即可完成</p> <p>​ Author.objects.all().update(属性=值,属性=值)</p> <h4>4.通过视图删除数据</h4> <p>​ 1.delete()</p> <p>​ Author.objects.get(id=2).delete()</p> <p>​ Author.objects.filter(age__gt=50).delete()</p> <h4>5.F()操作和Q()操作</h4> <p>​ 1.F()</p> <p>​ update author ser age = age + 10</p> <p>​ Author .objects.all().update(age = age+ 10)</p> <p>​ 作用:用于执行过程中获取某列的值</p> <p>​ 语法:F(&#39;列名&#39;)</p> <p>​ from Django.db.models import F</p> <p>​ Author .objects.all().update(age = F(&#39;age&#39;) + 10)</p> <p>​ 2.Q()</p> <p>​ from django.db.models import Q</p> <p>​ Author.objects.filter(Q(id=1) | Q(age=60)) </p> <p>&nbsp;</p> <p>​ 6.原生的数据库操作</p> <p>​ 1.查询</p> <p>​ 接口:raw()</p> <p>​ 语法:Entry.objects.raw(sql)</p> <p>​ 参数sql:要执行的查询SQL语句</p> <p>​ 2.增删改</p> <p>​ def cud(request):</p> <p>​ with connection.cursor() as cursor:</p> <p>​ sql = &#39;...&#39;</p> <p>​ cursor.execute(sql)</p> <p>​ return render(......)</p> <h3>1.使用后台管理models</h3> <h4>1.创建管理员</h4> <p>​ manage.py createsuperuser</p> <p>​ username:admin 指定用户</p> <p>​ email:<a href='mailto:1175715363@qq.com' target='_blank' class='url'>1175715363@qq.com</a> 指定邮箱</p> <p>​ password:adminadmin 密码8位</p> <h4>2.基本管理</h4> <h5>1.在应用中admin.py 中注册要管理的models</h5> <p>​ 1.admin.py</p> <p>​ 作用:注册需要管理的models,只有在此注册的models才允许被后台管理</p> <p>​ 2.注册Models</p> <p>​ from .models import *</p> <p>​ admin.site.register(Entry)</p> <p>​ ex:</p> <p>​ admin.site.register(Author)</p> <p>​ 3.修改models.py 处理显示的内容</p> <p>​ 在models 中的各个class中追加</p> <p>​ def ——str--(self):</p> <p>​ return self.name</p> <p>​ 4.通过Meta内部类实现 展开属性</p> <p>​ 每个models 类中都可以声明 内部类Meta</p> <p>​ class Author(models,Models):</p> <p>​ ...</p> <p>​ class Meta:</p> <p>​ 1.db_table:指定实体类对应的表的名字</p> <p>​ 2.verbose_name:定义类在admin中显示的名称(单数形式)</p> <p>​ 3.verbose_name_plural:效果同上,复数形式</p> <p>​ 4.ordering:指定数据们的排序方式,取值为一个列表,默认是升序排序,降序</p> <p>​ 的话加减号’-&#39;</p> <h3>2.高级管理</h3> <h4>1.在admin.py中创建管理类,实现高级管理功能</h4> <p>​ 1.定义EntryAdmin,继承自admin.ModelsAdmin</p> <p>​ class AuthorAdmin(admin.ModelsAdmin):</p> <p>​ pass</p> <p>​ 2.注册 高级管理类</p> <p>​ admin.site.register(Entry,EntryAdmin)</p> <p>​ admin.site.register(Author,AuthorAdmin)</p> <h4>2.允许在EntryAdmin中增加的属性</h4> <h5>1.list_display()</h5> <p>​ 作用:指定显示在实体信息页上的字段</p> <p>​ 取值:有属性名组成的元组或列表</p> <p>​ ex:</p> <p>​ list_display = [</p> <p>​ &#39;name&#39;,&#39;age&#39;,&#39;email&#39;</p> <p>​ ]</p> <h5>2.list_display_links</h5> <p>​ 作用:定义能够链接到详细页面的链接</p> <p>​ 取值:有属性名组成的元组或列表</p> <p>​ 注意:取值必须出现在list_display中</p> <h5>3.list_editable</h5> <p>​ 作用:指定在是信息页上允许被修改的字段</p> <p>​ 取值:由属性名组成的元组或列表</p> <p>​ 注意:取值不能出现在list_display_links中的值 </p> <h5>4.search_fields</h5> <p>​ 作用:添加允许被搜索的字段</p> <p>​ 取值:由属性组成的元组</p> <p>​ 5.过滤器list_filter</p> <p>​ 作用:在实体信息页右侧增加一个过滤器</p> <p>​ 一遍实现快速筛选</p> <p>​ 取值:由属性名组成的 </p> <h1>day06:</h1> <h5>6.date_hierarchy</h5> <p>​ 作用:在实体信息页面的顶部增加时间选择器</p> <p>​ 取值:必须是DateField 或DateTimeField的列名</p> <h5>7.fields</h5> <p>​ 作用:在实体的详细页中,定义显示那些字段,按照什么样的顺序</p> <p>​ 取值:由属性名组成的元组或列表</p> <h5>8.fieldsets</h5> <p>​ 作用:在实体详细页面中,对属性进行分组</p> <p>​ 注意:fieldsets 和 fields不能同时出现</p> <p>​ 语法:</p> <p>​ fieldsets = (</p> <p>​ (&#39;分组名称1&#39;,{</p> <p>​ &#39;fields&#39;:(&#39;字段1&#39;,&#39;字段2&#39;),</p> <p>​ &#39;classes&#39;:(&#39;collapse&#39;)}),</p> <p>​ (&#39;分组名称2&#39;,{</p> <p>​ &#39;fields&#39;:(&#39;字段1&#39;,&#39;字段2&#39;),</p> <p>​ &#39;classes&#39;:(&#39;collapse&#39;)}),</p> <p>​ )</p> <h3>2.Django的连接查询(关系映射)</h3> <h4>1.一对一映射(1:1)</h4> <h5>1.什么是一对一</h5> <p>​ A表中的一条数据对应B表中的一条数据</p> <p>​ 典型代表:一夫一妻</p> <p>​ 数据库中的实现:</p> <p>​ A表:设置主键</p> <p>​ B表:增加一列,并引用自A表中的主键,并增加唯一约束</p> <h5>2.语法</h5> <p>​ 一对一涉及到两个类中的任何一个类</p> <p>​ 属性 = models.OneToOneField(Entry)</p> <p>​ class Author(models.Model):</p> <p>​ name = models.CharField(max_length=30)</p> <p>​ class Wife(models.Model):</p> <p>​ name = models.CharField(max_length=30)</p> <p>​ author = models.OneToOneField(Author,on_delete=models.CASCADE)</p> <p>​ 正向查询:通过wife找Author</p> <p>​ wife = Wife.objects.get(id=1)</p> <p>​ author = wife.author</p> <p>​ 反向查询:通过Author找wife</p> <p>​ author = Author.objects.get(name=&#39;霍元甲&#39;)</p> <p>​ wife = author.wife</p> <h4>2.一对多</h4> <h5>1.什么是一对多</h5> <p>​ A表中的一条数据对应B表中的任意条数据</p> <p>​ 如:出版社 和 书籍</p> <p>​ 在数据库中的体现</p> <p>​ A表:设置主键</p> <p>​ B表:引用A表的主键</p> <h5>2.语法</h5> <p>​ 使用外键(Foreign Key)</p> <p>​ 属性 = models.ForeignKey(Entry)</p> <p>​ ex:</p> <p>​ Book(m)和Publisher(1)</p> <p>​ class Book():</p> <p>​ publisher = models.ForeignKey(Publisher,null=True,on_delete=models.CASCADE)</p> <h5>3.查询</h5> <p>​ 1.正向查询 通过book找publisher</p> <p>​ title = &#39;通过book找publisher&#39;</p> <p>​ book = Book.objects.get(id=1)</p> <p>​ publisher = book.publisher</p> <p>​ 2.反向查询 通过publisher找book</p> <p>​ publisher = Publisher.objects.get(name=&#39;交大出版社&#39;)</p> <p>​ listbook= publisher.Book</p> <h1>day07:</h1> <h4>3.多对多</h4> <h5>1.什么是多对多</h5> <p>​ A表中一条数据对应B表中任意条数据匹配,</p> <p>​ 同时B表中的一条数据也可以与A表中的任意条数据对应 </p> <h5>2.语法</h5> <p>​ 在多对多的任何一个Models类中均可实现</p> <p>​ entry = models.ManyToManyField(Entry)</p> <p>​ class Book(models.Model):</p> <p>​ ......</p> <p>​ class Author(models.Model):</p> <p>​ book = models.ManyToManyField(Book)</p> <h3>3.自定义查询对象(objects)</h3> <p>​ 1.声明类 EntryManager,继承自models,Manager,在EntryManager中增加自定义的函数</p> <p>​ class AuthorManager(models.Model):</p> <p>​ def 函数名(self,自定义参数):</p> <p>​ ....</p> <p>​ return ...</p> <p>​ def .........</p> <h2>3.HttpRequest</h2> <h4>1.什么是HTTPRequest</h4> <p>​ HttpRequest,请求对象,封装了请求对象过程中所有在Django中的数据,HttpRequest被化成了request封装到了视图处理函数中作为参数,该参数在试图处理函数被动调用时,自动传入。</p> <h4>2.HttpRequest中的主要内容</h4> <p>​ 1.request.scheme: 请求协议</p> <p>​ 2.request.body: 请求主体</p> <p>​ 3.request.path: 请求路径</p> <p>​ 4.request.method: 请求方式</p> <p>​ 5.request.get_host(): 请求主机地址或者域名</p> <p>​ 6.request.GET: 封装了GET方式的请求数据</p> <p>​ 7.request.POST: 封装了POST方式的请求数据</p> <p>​ 8.request.COOKIES: 封装了cookies的数据</p> <p>​ 9.request.META: 封装了请求的元数据</p> <h4>3.有关HTTP协议</h4> <h5>1.每一个请求会有method</h5> <p>​ 请求的method默认为get</p> <p>​ method:get、post、put、delete</p> <p>​ get:请求数据在地址栏后</p> <p>​ Query String</p> <p>​ post:请求数据在请求主体中</p> <p>​ FormData</p> <h5>2.请求主体</h5> <p>​ 只有post、put才能产生请求主体</p> <h4>4.csrf 跨站点攻击</h4> <p>​ 目的:解决跨站点发送POST请求的问题</p> <p>​ 解决方案:</p> <p>​ 1.删除Django.middleware.csrf.CsrfViewMiddleware</p> <p>​ 2.在处理的视图上加上标记@csrf_protect</p> <p>​ 3.在模板中<form>的底下第一行增加一个</p> <p>​ {%scrf_token%}</p> <h4>5.获取请求提交数据</h4> <h5>1.GET请求</h5> <p>​ request.GET[&#39;名称&#39;]</p> <h5>2.POST请求</h5> <p>​ request.POST[&#39;名称&#39;]</p> <p>​ 建议:request.POST.get(&#39;名称&#39;)</p> <p>​ request.POST.get(name)</p> </body> </html>

Django表单元素获取

<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title></title> </head> <body class="stackedit"> <div class="stackedit__html"><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;能搜索次问题就说明您对Django的基本配置views的基本写法有所了解我就其他方面的做过都的描述了。</p> <ol> <li>表单的基本数据类型<br> text、password、radio、checkbox、email等;</li> <li>如何获取这些类型的数据<br> 首先在form中需要把method设置为post。然后views文件中,需要用request.POST来获取基本数据<br> 1)、text、password、radio、email<br> 都可以用此方法<br> <code>name = request.POST.get('name')</code><br> 或者 <br> <code>name = request.POST['name']</code><br> 两个方法基本相同都是通过POST请求传输表达数据过来然后用name进行获取数据<br> 2)、checkbox<br> 用下面方法<br> <code>name = request.POST.getlist('name')</code><br> 首先是因为其传参过来是多条数据所有用词方法。</li> </ol> </div> </body> </html>

«FIRST PREVIOUS Page 4 of 4