Django必知必会系列文章 前文链接:Django必知必会(一)相关配置及动态URL
一、Django模版相关(HTML文档)
-
直接在视图函数中编写HTML肯定是一个错误的选择这样会讲Python代码和前端代码混在一起,工作效率会很低,Django在MVT设计模式中其中的 “T” 就是关于将Python代码和前端代码分开设计的,那么接下来就要涉及到模版引擎相关的知识了
-
什么是模版引擎?
- 模版引擎是为了使用户界面与业务数据(内容)分离而产生的,它可以生产特定格式的文档,用于网站的模版引擎就会生标准文档(HTML)简单来讲,就是将业务数据渲染到模版文件里,将模版文件和数据通过模版引擎生成HTML文档
-
Django常用模版引擎有哪些?
-
Jinja2:jinja2是Flask作者开发的一个模板系统,起初是仿django模板的一个模板引擎,为Flask提供模板支持,由于其灵活,快速和安全等优点被广泛使用。使用前需要配置,配置方式如下
TEMPLATES = [ { 'BACKEND': 'django.template.backends.jinja2.Jinja2', # jinja2模板引擎 'DIRS': [os.path.join(BASE_DIR, 'templates')], 'APP_DIRS': True, 'OPTIONS': { 'context_processors': [ 'django.template.context_processors.debug', 'django.template.context_processors.request', 'django.contrib.auth.context_processors.auth', 'django.contrib.messages.context_processors.messages', ], # 补充Jinja2模板引擎环境 'environment': 'utils.jinja2_env.jinja2_environment', }, }, ]
# django引擎环境代码,注意配置路径已经文件名 jinja2_env.py from django.contrib.staticfiles.storage import staticfiles_storage from django.urls import reverse from jinja2 import Environment def jinja2_environment(**options): env = Environment(**options) env.globals.update({ 'static': staticfiles_storage.url, 'url': reverse, }) return env
-
DTL(Django Templates Language):DTL是Django自带的模版引擎,使用时直接导入即可使用
from django.template import Template
-
-
Django中的 render() 函数
- 当一个请求发送到Django中时,往往要做的就是加载模版、查询数据、填充上下文,返回HttpResponse对象,这个过程是一个比较常见的任务,所以DJango尽可能的去优化让它变得简单所以就有了 render() 函数 from django.shortcuts import render 一行代码就可以将渲染好的模版返回给用户,但是你首先需要在模版文件中(HTML) 提前编写好模版语法按照对应的变量名去传递参数,模版引擎语法在这里不多描述,下面是一个模版渲染的示例代码:
render(request, "index/index.html", {"username": username1, "rank_news": new})
-
二、Django模型(数据库交互)
-
Django数据层:现代Web应用而言,视图逻辑经常需要与数据库进行交互。在数据库驱动型网站中,网站连接数据库服务器,从中检索数据,然后在网页中把数据显示出来,或者需要用户来填充数据。接下来将介绍Django的数据层。既:MVT 中的“M” 数据模型。
-
为什么需要数据模型?Python中有交互数据库的模块叫PyMySQL它可以实现使用Python在MySQL中实现增删改查,用过它的朋友应该都知道,使用它前需要建立连接、创建游标、执行语句、关闭连接,如果直接使用它的话,代码会很冗余,如果不使用MySQL使用那么数据库交互的代码几乎要改一大半,这简直是无法想象的事情!这些问题Django已经为我们解决,数据库连接参数是硬编码的。理想的做法是,把这些参数存储在 Django 配置中,数据交互就需要了解另外一个知识:ORM(对象—关系映射)
-
ORM介绍:Object-Relation Mapping 中文意思是对象—关系映射,在MVC/MVT设计模式中的Model都包括它。ORM的优势在于只需要面向对象编程,对数据库的操作都转化成对类属性和方法的操作,实现了数据模型与数据库解耦,屏蔽了不同数据库操作上的差异(不再关心使用的是MySQL还是PostgreSQL);ORM的劣势:相比于直接使用SQL语句操作数据库,有性能损失,根据对象的操作转化成SQL语句,根据查询的结果转化为对象,在映射过程中可能会有性能损失。
-
Django使用模型:刚才介绍了ORM的概念,在Djangp中通过模型在背后执行SQL语句,返回便利的Python数据结构,表示数据库表中的行。Django 还通过模型表示 SQL 无法处理的高层级概念。接下来介绍如何定义一个模型:
-
配置数据库:Django中默认使用的数据库是 sqlite3 如果要使用其它数据库需要修改 DATABASES 里面的配置,下面是配置MySQL数据库的方法:
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', # 数据库引擎 'HOST': '127.0.0.1', # 数据库主机 'PORT': 3306, # 数据库端口 'USER': 'root', # 数据库用户名 'PASSWORD': 'xxxxxx', # 数据库用户密码 'NAME': 'xxx' # 数据库名字 }, }
Django ORM封装了PyMySQL所以还需要在 init 添加下面两行代码引入PyMySQL,如果是PostgreSQL 的话则需要配置 psycopg2 模块
import pymysql pymysql.install_as_MySQLdb()
-
编写数据模型:Django模型需要在app应用中的 models.py 继承 django.db.models 进行编写,models中的属性在这里不多介绍了,下图是一个数据模型示例:
class New(models.Model): new_cate = models.ForeignKey(Cate, related_name="类别") # 所属类别 new_time = models.CharField(max_length=100, verbose_name="发布时间") new_seenum = models.IntegerField(verbose_name="浏览次数", default=0) new_disnum = models.IntegerField(verbose_name="跟帖次数", default=0) index_image_url = models.CharField(max_length=200, verbose_name="新闻列表图片路径", default='SOME STRING') # related_name定义主表对象查询子表时使用的方法名称 new_title = models.CharField(blank=False, max_length=100, verbose_name="标题") new_source = models.TextField(verbose_name="新闻来源", max_length=20, blank=False, default="Fantasy News") digest = models.CharField(max_length=500, default='SOME STRING') # 新闻摘要 new_content = models.TextField(blank=False, verbose_name="新闻内容") def __str__(self): return self.new_title class Meta: db_table = 'new' verbose_name_plural = "新闻信息表"
-
创建数据模型:使用Python编写好数据模型类后就可以使用数据库迁移命令Django将根据编写的数据库模型类,创建数据表,这个过程中我们常常需要下面4个命令:
- python manage.py check 运行后DJango将检查框架,即验证 Django 项目的一系列静态检查;如果你的模型或者其它地方有问题,Django会将错误输出。
- python manage.py makemigrations xxx 应用的名字,如果没有指定将自动检测哪些应用中的模型被修改,然后生成迁移文件;Django将数据库中的改动都存储在了migrations文件夹中,运行命令后会自动生成 0001_initial.py 这样的文件。
- python manage.py migrate 会根据 makemigrations 生成的迁移文件中的改动更新到数据库中,所以使用 migrate 前需要先使用makemigrations是生成迁移文件。
- python manage.py sqlmigrate 应用名 迁移文件编号 使用它可以将迁移文件中的改动输出对应的SQL语句
-
模型与数据库的交互:增、删、改、查都有对应的方法操作,不多描述。
-
后记:ORM模型虽然很方便,但站在SQL优化的角度去看,它只能满足一些符合逻辑、合法、基本的索引查询,无论是多么复杂的ORM工具,在精妙和复杂的索引面前都是“浮云”。所以熟练使用工具的情况下我们还需要理解底层原理。