文章目录

  • Django操作数据库
    • Django访问流程
    • 空项目结构
      • ASGI和WSGI区别
    • HelloWord
      • views和url配置
      • 目录
      • 讲解
      • 效果
    • 模板
      • 模板应用实例
        • 目录结构
        • 新建html文件
        • 向Django说明模板文件的路径
        • 修改 views.py
        • 修改urls.py
      • 过滤器标签
        • 常用过滤器函数
      • if/else 标签
        • 示例
      • for 标签
      • ifequal/ifnotequal 标签
      • 注释标签
      • include 标签
      • csrf_token
    • Django 模型
      • Django ORM
      • 定义数据库模型
      • 数据库操作
        • 添加数据
        • 修改数据
        • 删除数据
        • 查询数据

Django操作数据库

Django访问流程

  1. 用户通过浏览器发送请求,到达WSGI服务器,使用其handler方法来处理HTTP请求(其实最终是调用wsgiref.handlers.BaseHandler中的run方法处理);
  2. 请求到达request中间件,中间件对request请求进行预处理或者直接返回response;
  3. 如果没有response,到达url进行匹配,找到相应的视图函数;
  4. 视图函数做出相应处理或者直接返回response;
  5. 视图层View 可以通过Model层与数据库进行交互;
  6. 取得相应数据后返回给template模板;
  7. 通过response展示给客户.

空项目结构

|-- ProjectName
|   |-- __init__.py
|   |-- asgi.py
|   |-- settings.py
|   |-- urls.py
|   |-- wsgi.py
|-- manage.py
  • ProjectName: 项目的容器。
  • manage.py: 一个实用的命令行工具,可让你以各种方式与该 Django 项目进行交互。
  • ProjectName/init.py: 一个空文件,告诉 Python 该目录是一个 Python 包。
  • ProjectName/asgi.py: 一个 ASGI 兼容的 Web 服务器的入口,以便运行你的项目。
  • ProjectName/settings.py: 该 Django 项目的设置/配置。
  • ProjectName/urls.py: 该 Django 项目的 URL 声明; 一份由 Django 驱动的网站"目录"。
  • ProjectName/wsgi.py: 一个 WSGI 兼容的 Web 服务器的入口,以便运行你的项目。

ASGI和WSGI区别

以上,WSGI是基于HTTP协议模式的,不支持WebSocket,而ASGI的诞生则是为了解决Python常用的WSGI不支持当前Web开发中的一些新的协议标准。同时,ASGI对于WSGI原有的模式的支持和WebSocket的扩展,即ASGI是WSGI的扩展。

HelloWord

views和url配置

  1. 在先前创建的 ProjectName 目录下的 ProjectName目录新建一个 views.py 文件,并输入代码:

    from django.http import HttpResponsedef hello(request):return HttpResponse("你好世界!")def hello2(request):return HttpResponse("Hello Word!")
  2. 绑定 URL 与视图函数。打开 urls.py 文件,删除原来代码,将以下代码复制粘贴到 urls.py 文件中:

    from django.urls import include, re_path
    from . import views# re_path是django2的写法
    # ^匹配开始  $匹配结束
    urlpatterns = [re_path(r'^$', views.hello), re_path('hello2/', views.hello2)]
    

    目录

    |-- ProjectName
    | |-- __init__.py
    | |-- asgi.py
    | |-- settings.py
    | |-- urls.py
    | |-- wsgi.py
    | |-- views.py

    |-- manage.py

    讲解

    1. 浏览器访问localhost:8000
    2. 浏览器默认通过get请求访问服务器
    3. 到达WSGI服务器,使用wsgiref.handlers.BaseHandler中的run方法处理
    4. 进入urls.py匹配hello视图
    5. 在views.py中找到hello类
    6. hello类继承了request并做出response相应
    7. 返回给浏览器

    效果

    1. 访问localhost:8000返回views.hello的响应(你好世界)
    2. 访问localhost:8000/hello2返回views.hello2的响应(Hello Word)

模板

上一章节中我们使用 django.http.HttpResponse() 来输出 “Hello World!”。该方式将数据与视图混合在一起,不符合 Django 的 MVC 思想。

本章节我们将为大家详细介绍 Django 模板的应用,模板是一个文本,用于分离文档的表现形式和内容。

模板应用实例

使用模板给HTML中输出数据

ProjectName目录底下创建 templates 目录并建立 runoob.html文件

目录结构

|-- ProjectName
| |-- __init__.py
| |-- asgi.py
| |-- settings.py
| |-- urls.py
| |-- wsgi.py
| |-- views.py
|-- manage.py
|-- templates
| |-- runoob.html

新建html文件

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<h1>{{ hello }}</h1>
</body>
</html>

变量模板语法:

view:{"HTML变量名" : "views变量名"}
HTML:{{变量名}}

向Django说明模板文件的路径

修改HelloWorld/settings.py,修改 TEMPLATES 中的 DIRS 为 [os.path.join(BASE_DIR, ‘templates’)],如下所示:

...
TEMPLATES = [{'BACKEND': 'django.template.backends.django.DjangoTemplates','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',],},},
]
...

修改 views.py

增加一个新的对象,用于向模板提交数据:

def runoob(request):return render(request, 'runoob.html', {'hello': 'Hello World!'})

修改urls.py

# ^匹配开始  $匹配结束
urlpatterns = [re_path(r'^$', views.hello),re_path('hello2/', views.hello2),re_path('runoob/', views.hello2)]

过滤器标签

模板语法:{{ 变量名 | 过滤器:可选参数 }}

模板过滤器可以在变量被显示前修改它,过滤器使用管道字符,如下所示:

{{ name|lower }}

{{ name }} 变量被过滤器 lower 处理后,文档大写转换文本为小写。

过滤管道可以被* 套接* ,既是说,一个过滤器管道的输出又可以作为下一个管道的输入:

{{ my_list|first|upper }}

常用过滤器函数

  1. truncatewords

    {{ bio|truncatewords:"30" }}
    # 显示bio变量的前30个字
    
  2. length

    返回对象的长度,适用于字符串和列表。

    字典返回的是键值对的数量,集合返回的是去重后的长度。

  3. filesizeformat

    以更易读的方式显示文件的大小(即’13 KB’, ‘4.1 MB’, '102 bytes’等)。

    字典返回的是键值对的数量,集合返回的是去重后的长度。

  4. date

    根据给定格式对一个日期变量进行格式化。

    格式 Y-m-d H:i:s返回 年-月-日 小时:分钟:秒 的格式时间。

  5. truncatechars如果字符串包含的字符总个数多于指定的字符数量,那么会被截断掉后面的部分。

    截断的字符串将以 结尾。

  6. safe(可以定义html)

    将字符串标记为安全,不需要转义。

    要保证 views.py 传过来的数据绝对安全,才能用 safe。

    和后端 views.py 的 mark_safe 效果相同。

    Django 会自动对 views.py 传到HTML文件中的标签语法进行转义,令其语义失效。加 safe 过滤器是告诉 Django 该数据是安全的,不必对其进行转义,可以让该数据语义生效。

    from django.shortcuts import renderdef runoob(request):views_str = "<a href='https://www.runoob.com/'>点击跳转</a>"return render(request, "runoob.html", {"views_str": views_str})
    
    {{ views_str|safe }}
    

if/else 标签

基本语法格式如下:

{% if condition %}
... display
{% endif %}

或者:

{% if condition1 %}
... display 1
{% elif condition2 %}
... display 2
{% else %}
... display 3
{% endif %}

根据条件判断是否输出。if/else 支持嵌套。

{% if %} 标签接受 and , or 或者 not 关键字来对多个变量做判断 ,或者对变量取反( not ),例如:

{% if athlete_list and coach_list %}
athletes 和 coaches 变量都是可用的。
{% endif %}

示例

  1. views.py
from django.shortcuts import renderdef runoob(request):
views_num = 88
return render(request, "runoob.html", {"num": views_num})
  1. 模板html
{%if num > 90 and num <= 100 %}
优秀
{% elif num > 60 and num <= 90 %}
合格
{% else %}
一边玩去~
{% endif %}

for 标签

{% for %} 允许我们在一个序列上迭代。

与 Python 的 for 语句的情形类似,循环语法是 for X in Y ,Y 是要迭代的序列而 X 是在每一个特定的循环中使用的变量名称。

每一次循环中,模板系统会渲染在 {% for %}{% endfor %} 之间的所有内容。

例如,给定一个运动员列表 athlete_list 变量,我们可以使用下面的代码来显示这个列表:

<ul>
{% for athlete in athlete_list %}<li>{{ athlete.name }}</li>
{% endfor %}
</ul>

{% empty %}

可选的 {% empty %} 从句:在循环为空的时候执行(即 in 后面的参数布尔值为 False )。

{% for i in listvar %}{{ forloop.counter0 }}
{% empty %}空空如也~
{% endfor %}

ifequal/ifnotequal 标签

{% ifequal %} 标签比较两个值,当他们相等时,显示在 {% ifequal %} 和 {% endifequal %} 之中所有的值。

下面的例子比较两个模板变量 user 和 currentuser :

{% ifequal user currentuser %}<h1>Welcome!</h1>
{% endifequal %}

和 {% if %} 类似, {% ifequal %} 支持可选的 {% else%} 标签:8

{% ifequal section 'sitenews' %}<h1>Site News</h1>
{% else %}<h1>No News Here</h1>
{% endifequal %}

注释标签

Django 注释使用 {# #}。

{# 这是一个注释 #}

include 标签

{% include %} 标签允许在模板中包含其它的模板的内容。

下面这个例子都包含了 nav.html 模板:

{% include "nav.html" %}

csrf_token

csrf_token 用于form表单中,作用是跨站请求伪造保护。

如果不用{% csrf_token %}标签,在用 form 表单时,要再次跳转页面会报403权限错误。

用了{% csrf_token %}标签,在 form 表单提交数据时,才会成功。

解析:

首先,向服务器发送请求,获取登录页面,此时中间件 csrf 会自动生成一个隐藏input标签,该标签里的 value 属性的值是一个随机的字符串,用户获取到登录页面的同时也获取到了这个隐藏的input标签。

然后,等用户需要用到form表单提交数据的时候,会携带这个 input 标签一起提交给中间件 csrf,原因是 form 表单提交数据时,会包括所有的 input 标签,中间件 csrf 接收到数据时,会判断,这个随机字符串是不是第一次它发给用户的那个,如果是,则数据提交成功,如果不是,则返回403权限错误。

Django 模型

Django 对各种数据库提供了很好的支持,包括:PostgreSQL、MySQL、SQLite、Oracle。

Django 为这些数据库提供了统一的调用API。 我们可以根据自己业务需求选择不同的数据库。

MySQL 是 Web 应用中最常用的数据库。本章节我们将以 Mysql 作为实例进行介绍。

如果你没安装 mysql 驱动,可以执行以下命令安装:

sudo pip3 install pymysql

在项目的 settings.py 文件中找到 DATABASES 配置项,将其信息修改为:

DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql',    # 数据库引擎'NAME': 'runoob', # 数据库名称'HOST': '127.0.0.1', # 数据库地址,本机 ip 地址 127.0.0.1 'PORT': 3306, # 端口 'USER': 'root',  # 数据库用户名'PASSWORD': '123456', # 数据库密码}
}

Django ORM

Django 模型使用自带的 ORM。

对象关系映射(Object Relational Mapping,简称 ORM )用于实现面向对象编程语言里不同类型系统的数据之间的转换。

ORM 在业务逻辑层和数据库层之间充当了桥梁的作用。

ORM 是通过使用描述对象和数据库之间的映射的元数据,将程序中的对象自动持久化到数据库中。

ORM 对应关系表:

定义数据库模型

  1. 创建 APP

Django 规定,如果要使用模型,必须要创建一个 app。我们使用以下命令创建一个 TestModel 的 app:(命令行项目路径下)

django-admin.py startapp TestModel
  1. 目录结构如下:
ProjectName
|-- ProjectName
|-- manage.py
...
|-- TestModel
|   |-- __init__.py
|   |-- admin.py
|   |-- models.py
|   |-- tests.py
|   `-- views.py
  1. 声明数据库表

    修改 TestModel/models.py 文件,代码如下:

    # models.py
    from django.db import modelsclass Test(models.Model):name = models.CharField(max_length=20)
    

    以上的类名代表了数据库表名,且继承了models.Model,类里面的字段代表数据表中的字段(name),数据类型则由CharField(相当于varchar)、DateField(相当于datetime), max_length 参数限定长度。

  2. 安装app

    在 settings.py 中找到INSTALLED_APPS这一项,如下:

    INSTALLED_APPS = ('django.contrib.admin','django.contrib.auth','django.contrib.contenttypes','django.contrib.sessions','django.contrib.messages','django.contrib.staticfiles','TestModel',               # 添加此项
    )
    
    1. 命令行运行

      $ python36 manage.py migrate   # 创建表结构
      $ python36 manage.py makemigrations TestModel  # 让 Django 知道我们在我们的模型有一些变更
      $ python36 manage.py migrate TestModel   # 创建表结构
      

      看到几行 “Creating table…” 的字样,你的数据表就创建好了。

      Creating tables ...
      ……
      Creating table TestModel_test  #我们自定义的表
      ……
      

      表名组成结构为:应用名_类名(如:TestModel_test)。

      **注意:**尽管我们没有在 models 给表设置主键,但是 Django 会自动添加一个 id 作为主键。

数据库操作

接下来我们在 HelloWorld 目录中添加 testdb.py 文件(下面介绍),并修改 urls.py:

from django.urls import path
from . import views,testdb
urlpatterns = [path('runoob/', views.runoob),path('testdb/', testdb.testdb),
]

添加数据

添加数据需要先创建对象,然后再执行 save 函数,相当于SQL中的INSERT:

# -*- coding: utf-8 -*-from django.http import HttpResponsefrom TestModel.models import Test# 数据库操作
def testdb(request):test1 = Test(name='runoob')test1.save()return HttpResponse("<p>数据添加成功!</p>")

修改数据

修改数据可以使用 save() 或 update():

# -*- coding: utf-8 -*-from django.http import HttpResponsefrom TestModel.models import Test# 数据库操作
def testdb(request):# 修改其中一个id=1的name字段,再save,相当于SQL中的UPDATEtest1 = Test.objects.get(id=1)test1.name = 'Google'test1.save()# 另外一种方式#Test.objects.filter(id=1).update(name='Google')# 修改所有的列# Test.objects.all().update(name='Google')return HttpResponse("<p>修改成功</p>")

删除数据

删除数据库中的对象只需调用该对象的delete()方法即可:

# -*- coding: utf-8 -*-from django.http import HttpResponsefrom TestModel.models import Test# 数据库操作
def testdb(request):# 删除id=1的数据test1 = Test.objects.get(id=1)test1.delete()# 另外一种方式# Test.objects.filter(id=1).delete()# 删除所有数据# Test.objects.all().delete()return HttpResponse("<p>删除成功</p>")

查询数据

Django提供了多种方式来获取数据库的内容,如下代码所示:

# -*- coding: utf-8 -*-from django.http import HttpResponsefrom TestModel.models import Test# 数据库操作
def testdb(request):# 初始化response = ""response1 = ""# 通过objects这个模型管理器的all()获得所有数据行,相当于SQL中的SELECT * FROMlist = Test.objects.all()# filter相当于SQL中的WHERE,可设置条件过滤结果response2 = Test.objects.filter(id=1) # 获取单个对象response3 = Test.objects.get(id=1) # 限制返回的数据 相当于 SQL 中的 OFFSET 0 LIMIT 2;Test.objects.order_by('name')[0:2]#数据排序Test.objects.order_by("id")# 上面的方法可以连锁使用Test.objects.filter(name="runoob").order_by("id")# 输出所有数据for var in list:response1 += var.name + " "response = response1return HttpResponse("<p>" + response + "</p>")

Django操作数据库相关推荐

  1. django_4:数据库1——django操作数据库

    创建数据库记录(插入) 使用python3 manage.py shell(python3亲测好使) ipython3 manage.py shell(亲测不好使) 方式一. [root@centos ...

  2. 关于python+django操作数据库中的表

    数据库中的表示这样设计的 class C(models.Model):name = models.CharField(max_length=32) class B(models.Model):name ...

  3. Django 操作Mysql数据库 对表进行增删改查

    为什么80%的码农都做不了架构师?>>>    首先说明:以下方法都是根据表已有的字段添加数据,若想新增字段,则需在类里面新建静态字段, 可参考Django 操作数据库建表  ,增删 ...

  4. python中cursor操作数据库(转)

    原文出处:http://doudouclever.blog.163.com/blog/static/175112310201284115340663/ python 操作数据库,要安装一个Python ...

  5. python中cursor的用法_python MySQLdb用法,python中cursor操作数据库(转)

    数据库连接 连接数据库前,请先确认以下事项: 您已经创建了数据库 TESTDB. 在TESTDB数据库中您已经创建了表 EMPLOYEE EMPLOYEE表字段为 FIRST_NAME, LAST_N ...

  6. Django与数据库操作

    Django与数据库操作 数据库连接的方法 web 框架 django --- 自己内部实现 (ORM) + pymysql(连接)Flask,tornado ---pymysqlSQLArchemy ...

  7. php django mysql配置文件_Mysql学习Django+mysql配置与简单操作数据库实例代码

    <Mysql学习Django+mysql配置与简单操作数据库实例代码>要点: 本文介绍了Mysql学习Django+mysql配置与简单操作数据库实例代码,希望对您有用.如果有疑问,可以联 ...

  8. Django ORM 数据库操作

    比较有用 转自 http://blog.csdn.net/fgf00/article/details/53678205 一.DjangoORM 创建基本类型及生成数据库表结构 1.简介 2.创建数据库 ...

  9. django mysql数据同步_[django同步数据库]Django去操作已经存在数据的数据库

    数据库,各种表结构已经创建好了,甚至连数据都有了,此时,我要用Django管理这个数据库,ORM映射怎么办??? Django是最适合所谓的green-field开发,即从头开始一个新的项目 但是呢, ...

最新文章

  1. digitalocean如何还原出厂设置
  2. C++知识点35——使用智能指针的注意事项(上)
  3. TabHost.TabSpec中的标签实现图文左右排(默认上下排)
  4. mysql查询条件字段值末尾有空格的问题
  5. P3203-[HNOI2010]弹飞绵羊【分块】
  6. Idea Marketplace 加载很慢 加载不出来
  7. RocketMQ如何保证消息顺序消费?又为何不解决消息重复消费问题?
  8. 中国水培营养素行业市场供需与战略研究报告
  9. 强的离谱!串烧70+个Transformer模型,涵盖CV、NLP、金融、隐私计算...
  10. Maven工具的简单介绍,以及manen与spring框架之前的优缺点,解决什么是maven、为什么要使用maven,使用maven的好处等问题
  11. Matlab机器学习之SVM工具箱
  12. ic和mos怎么区分_快速掌握MOS管源极和漏极的区别!看了受益匪浅!
  13. 4.电子计算机的分类,公基计算机基础知识汇总40
  14. 数据库系统概念 实验1~实验9
  15. poj3254/洛谷P1896 状压dp
  16. 开启Fluter基础之旅二-------Future再论、常用组件、Material Design风格组件学习
  17. EasyRecovery最新中文Win/Mac全版本下载安装激活数据恢复软件
  18. n维椭球体积公式_土建安装中你经常会用到又容易忘记的计算公式
  19. ie退出全屏快捷键_讲解win7电脑全屏快捷键介绍
  20. mysql查附近500米商户_mysql查询附近门店

热门文章

  1. svn客户端在服务器创建项目,win7下安装svn服务器端及客户端详细步骤
  2. ❤️熬夜爆肝十万字❤️Java最简单最全入门基础知识(一)(小白必备--推荐小白收藏)❤️
  3. 7z文件压缩、解压 (7zTool.exe)
  4. 2s-AGCN 代码理解
  5. 基于深度神经网络的中药材识别
  6. 加油(c++程序猿)
  7. 计算机数据采集处理系统使用方法,数据采集与处理系统的要求
  8. 武汉云数时代网络科技有限公司代运营具体需要做好哪些方面?
  9. 停车场门禁控制系统的状态机
  10. onpageshow 用户浏览网页时触发