Django框架基础

<h1>1.Django框架</h1> <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> pip3 install Django</p> <h5>4.Django使用</h5> <p>​ 1.创建Django项目</p> <p> django-admin.py startproject 项目名</p> <p> 也可以在pyChram点击创建Django项目按钮</p> <p> 2.通过manage.py 启动</p> <p> 进入项目目录下</p> <p> python manage.py runserver或</p> <p> python manage.py runserver 0.0.0.0:80</p> <h5>5.Django 的结果介绍</h5> <p> 1.manage.py 文件</p> <p> 负责执行Django中的各项目操作的文件</p> <p> 如: 启动服务、创建应用、创建管理员,创建用户</p> <p> 2.主文件夹中的内容</p> <p> 1.<strong>init</strong>.py</p> <p> 项目初始化文件,每当启动项目时,自动执行</p> <p> 有初始化文件,放在此处如果使用的是MySQL服务器需要在此配置如下:</p> <p> import pymysql</p> <p> pymysql.install_as_MySQLdb()</p> <p> 2.setting.py(重要文件)</p> <p> 项目的主配置文件</p> <p> 1.BASE_DIR:项目所在地绝对路径,一般默认 2.DEBUG:调试模式 开发过程中,推荐使用True, 上线运行时,推荐使用False, 3.ALLOWED_HOSTS 如果不设置,只有本地能访问。 通常推荐为“*” 4.INSTALLED_APPS 指定安装的应用,如果新建应用需要在此进行配置应用名称如:index 5.MIDDLEWARE:指定中间 6.ROOT-URLCONF:指定项目的基础路由配置文件 7.TEMPLATES:指定模板信息 8.DATABASES:制定数据库信息 </p> <p> 9.LANGUGE_CODE:指定语言</p> <p> 一般改成中文编码:zh-Hans</p> <p> 10.静态路由地址 STATIC_URL = &#39;/static/&#39;</p> <p> 3.urls.py</p> <p> 项目路由配置文件</p> <p> 路由:去哪找执行文件</p> <p> 一般情况下的配置如下:path()</p> <p> </p> <pre><code class='language-python' lang='python'>from django.urls import path from .views import * urlpatterns = [ path(&#39;&#39;, index_views, name=&#39;index&#39;), path(&#39;single/(?P&lt;id&gt;\d+)/&#39;, single_views, name=&#39;single&#39;), path(&#39;single_class/(?P&lt;name&gt;\w+)/&#39;, single_class_views, name=&#39;single_class&#39;), path(&#39;full-width/&#39;, full_width_views, name=&#39;full&#39;), path(&#39;full-list/(?P&lt;id&gt;\d+)/&#39;, full_list_views, name=&#39;full_list&#39;), path(&#39;about/&#39;, about_views, name=&#39;about&#39;), path(&#39;contact/&#39;, contact_views, name=&#39;contact&#39;) ] </code></pre> <p>​ 4.wsgi.py</p> <p> 应用服务器配置,暂时不用</p> <p> 3.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.path函数</p> <p> path 函数语法</p> <p> path(regex,views,kwargs=None,name=None)</p> <p> 1.regex </p> <p> 正则表达式,匹配请求的url</p> <p> 访问时的路由地址,可以加参数,参数需要进行正则校验;</p> <p>​ 2.views</p> <p> URL 处理的视图函数,自定义</p> <p> views层对应的方法名,需要在里面实现页面的跳转;</p> <p> 3.kwargs</p> <p> 字典,向views传参时使用</p> <p>​ 4.name</p> <p>​ 字符串,给url起一个别名,在模板中使用</p> <p> 4.通过url向views传参</p> <p> </p> <pre><code>from django.urls import path # 这是对应的path path(&#39;index/(\d{4})/(\d{2})/(\d{2})&#39;,index_views) # 这是对应的请求链接 http://localhost:8000/index/2018/07/11 </code></pre> <p> </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> <h5>4.Django应用</h5> <h5>1.Django中的模板</h5> <p> 1.什么是模板?</p> <p>​ 就是一个网页,可被视图相应给用户</p> <p>​ 2.模板设置</p> <p> 在setting中INSTALLED_APPS中需要加上应用名称</p> <p> 3.模板的加载方式</p> <p> 使用render或者render_to_response直接加载</p> <p> return render(request,‘网页’,参数三)</p> <p> 参数三:一般可以为固定对象,也可以为列表对象,如果较多可以直接使用locals()</p> <p> 4.url()中的第四个参数</p> <p> name:定义url的别名,允许在template中使用别名来访问url</p> <p> 在模板中,使用 name 加载</p> <p> <a href="{% url 'name别名'%}"></a>通过别名访问路径</p> <p> 5.模板语法</p> <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> <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> <p>&nbsp;</p> <h4>模型-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> </p> <pre><code>DATABASES = { &#39;default&#39;: { &#39;ENGINE&#39;: &#39;django.db.backends.mysql&#39;, &#39;NAME&#39;: &#39;laboratory&#39;, &#39;USER&#39;: &#39;root&#39;, &#39;PASSWORD&#39;: &#39;mysql&#39;, &#39;HOST&#39;: &#39;localhost&#39;, &#39;POST&#39;: &#39;3306&#39;, &#39;OPTIONS&#39;: {&#39;isolation_level&#39;: None} } } </code></pre> <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> <ol start='' > <li><p>manage.py makemigrations</p> <p> 在进行完models编写后在项目目录下使用该目录映射成py文件</p> </li> </ol> <p> 作用将每个应用下的models先映射成数据库的日志文件,并存放在每个应用下的migrations</p> <p> 文件中</p> <p> 若报错:</p> <p> 在主目录下的<strong>init</strong>.py</p> <p> import pymysql</p> <p> pymysql.install_as_MySQLdb()</p> <ol start='2' > <li>manage.py migrate</li> </ol> <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> <pre><code># 文章表的创建 class ARTICLE(models.Model): ARTICLE_ID = models.CharField(max_length=20, verbose_name=&quot;文章编码&quot;, primary_key=True) TITLE = models.CharField(max_length=40, verbose_name=&quot;文章主题&quot;) CONTENT = models.TextField(max_length=100000, verbose_name=&quot;文章内容&quot;) DATE = models.DateTimeField(verbose_name=&quot;发表文章时间&quot;) CATEGORY = models.CharField(max_length=20, verbose_name=&quot;文章类别&quot;) AUTHOR = models.CharField(max_length=20, verbose_name=&quot;文章作者&quot;) BROWSE = models.CharField(max_length=10, verbose_name=&quot;阅读量&quot;) def __str__(self): return self.TITLE class Meta: db_table = &quot;ARTICLE&quot; verbose_name = &#39;文章&#39; verbose_name_plural = verbose_name </code></pre> <p>&nbsp;</p> <h4>模型的数据库操作方法(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> <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> 一般情况下需要在创建完models之后进行高级管理配置</p> <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> <ol start='5' > <li><h5>过滤器list_filter</h5> </li> </ol> <p> 作用:在实体信息页右侧增加一个过滤器</p> <p> 一遍实现快速筛选</p> <p> 取值:由属性名组成的 </p> <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> <p>举个栗子:</p> <pre><code>from django.contrib import admin from .models import * # Register your models here. class ARTICLEAdmin(admin.ModelAdmin): list_display = [&#39;ARTICLE_ID&#39;, &#39;TITLE&#39;, &#39;DATE&#39;, &#39;CATEGORY&#39;, &#39;AUTHOR&#39;,&#39;BROWSE&#39;] list_display_links = [&#39;TITLE&#39;] list_editable = [] list_filter = [&#39;CATEGORY&#39;, &#39;AUTHOR&#39;] fieldsets = ( (&#39;基本信息:&#39;, {&#39;fields&#39;: (&#39;ARTICLE_ID&#39;, &#39;TITLE&#39;, &#39;CONTENT&#39;)}), (&#39;高级信息设置:&#39;, {&#39;fields&#39;: (&#39;DATE&#39;, &#39;CATEGORY&#39;, &#39;AUTHOR&#39;,&#39;BROWSE&#39;), &#39;classes&#39;: (&#39;collapse&#39;,)}), ) admin.site.register(ARTICLE, ARTICLEAdmin) </code></pre> <p>&nbsp;</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> <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>

Spring+SpringMVC+myBatis区别

<body><h2>1.1、Spring </h2> <p> Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson 在其著作Expert One-On-One J2EE Development and Design中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。Spring使用基本的JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅限于服务器端的开发。从简单性、可测试性和松耦合的角度而言,任何Java应用都可以从Spring中受益。 简单来说,Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。</p> <p> </p> <h2>1.2、SpringMVC <br/></h2> <p> Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面。Spring MVC 分离了控制器、模型对象、分派器以及处理程序对象的角色,这种分离让它们更容易进行定制。</p> <p> </p> <h2>1.3、MyBatis</h2> <p> MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。MyBatis是一个基于Java的持久层框架。iBATIS提供的持久层框架包括SQL Maps和Data Access Objects(DAO)MyBatis 消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索。MyBatis 使用简单的 XML或注解用于配置和原始映射,将接口和 Java 的POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。</p> </body>

Django框架通过表单发送邮件

<!doctype html> <html> <head> <meta charset='UTF-8'><meta name='viewport' content='width=device-width initial-scale=1'> <title></title></head> <body> <p> 为什么我回去做这个东西呢,主要是我在写blog的时候刚好我的blog模板中有这样一个版块就想了想去搞搞吧!在这个发送邮件的过程中主要需要用到三个两个库smtllib和email库,库可以在您的Windows工作域中使用</p> <p> <code>pip3 install smtplib/email</code></p> <p>进行安装库文件。</p> <p> 在使用QQ邮件代理发送邮件时,需要以下参数整理发件人邮箱、发件人姓名(可选)、发件人邮件授权码、邮件标题、邮件正文、收件人邮箱、收件人姓名(可选)、QQ邮件服务器地址、服务器端口等信息。</p> <p>web表单可以写成下面格式:</p> <pre><code class='language-python' lang='python'>&lt;input type=&quot;text&quot; name=&quot;name&quot; placeholder=&quot;Name&quot; required&gt; &lt;input type=&quot;email&quot; name=&quot;email&quot; placeholder=&quot;Email&quot; required&gt; &lt;input type=&quot;password&quot; name=&quot;password&quot; placeholder=&quot;邮件授权码&quot; required&gt; &lt;input type=&quot;text&quot; name=&quot;subject&quot; placeholder=&quot;Subject&quot; required&gt; &lt;textarea name=&quot;message&quot; rows=&quot;7&quot; placeholder=&quot;Your Message&quot; required&gt;&lt;/textarea&gt; </code></pre> <p>views进行参数整理因为点击提交按钮过来之后是我设置表单是POST请求,所以需要判断代码如下:</p> <pre><code class='language-Python' lang='Python'>import smtplib from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText from email.header import Header if request.method == &quot;POST&quot;: # 需要获取到的参数如下所示 smtpserver = &#39;smtp.qq.com&#39; smtpport = &#39;465&#39; from_name = request.POST.get(&#39;name&#39;) From_mail = request.POST.get(&#39;email&#39;) password = request.POST.get(&#39;password&#39;) subject = request.POST.get(&#39;subject&#39;) message = str(request.POST.get(&#39;message&#39;)) To_mail = &#39;****@qq.com&#39; # password = &#39;**********&#39; # 以下是对参数进行设置,方便在发送时符合正确的格式规则 msg = MIMEMultipart() msg[&quot;Subject&quot;] = Header(subject, &quot;utf-8&quot;) msg[&quot;From&quot;] = Header(From_mail+&#39;&lt;&#39;+from_name+&#39;&gt;&#39;, &quot;utf-8&quot;) msg[&quot;To&quot;] = Header(To_mail, &quot;utf-8&quot;) msgText = MIMEText(message, &#39;plain&#39;, &#39;utf-8&#39;) msg.attach(msgText) </code></pre> <p>服务层处理代码,需要根据以上获取到的参数进行请求转发邮件,代码请看下面:</p> <pre><code class='language-python' lang='python'>def sendsmtp(msg, From_mail, password, To_mail, smtpserver, smtpport,): try: # 这块是通过SMTP_SSL进行服务器连接 smtp = smtplib.SMTP_SSL(smtpserver, smtpport) # 根据用户邮箱账号和邮件授权码进行登录邮箱 smtp.login(From_mail, password) # 发送邮件,最后参数是要发送的内容 smtp.sendmail(From_mail, To_mail, msg.as_string()) tishi = &#39;发送成功!&#39; except(smtplib.SMTPRecipientsRefused): tishi = (&quot;Recipient refused&quot;) except(smtplib.SMTPAuthenticationError): tishi = &quot;Auth error&quot; except(smtplib.SMTPSenderRefused): tishi = &quot;Sender refused&quot; except(smtplib.SMTPException) as e: tishi = e.message finally: # 完成之后一定到对内存进行释放 smtp.quit() return tishi </code></pre> <p>最后简单说一说邮件授权码怎么获取吧,在QQ邮箱设置中找到账户往下拉会有下面这个东西</p> <p><img src='/static/upload/邮件授权码.png' alt='' referrerPolicy='no-referrer' /></p> <p>把SMTP服务打开,然后点击下面生成授权码即可获取到邮件授权码。</p> </body> </html>

«FIRST PREVIOUS Page 2 of 3 NEXT END»