框架第二课---静态文件配置,form表单细节介绍,request对象(重要),pycharm连接MySQL,django连接MySQL,django模型层初识,基本ORM操作

昨日内容回顾

  • 手写web框架

    1.socket服务端
    2.http协议
    3.网址后缀
    
  • wsgiref模块

    1.封装socket代码
    2.处理http相关数据
    
  • 代码封装优化

    1.函数
    2.对应关系
    3.文件、目录拆分
    
  • 动静态网页

    核心在于数据是否是动态获取的
    
  • jinja2模板语法

    pip3.8 install jinja2
    模板语法:支持将python后端数据传递给html页面并通过特殊语法完成操作(这些操作都在后端完成的!!!),最后再发送给前端,
    
  • python主流web框架

    django	大而全
    flask	小而精
    tornado	异步非阻塞
    
  • django简介

    1.版本问题
    	 django1.X
     	 django2.X
     	django3.X
     	django4.X
      ps:带LTS下标的为推荐使用版本或者说是稳定维护的版本!
    2.启动问题
    3.下载
    	pip3.8 install django==2.2.22 -i 源地址
    
  • django基本使用

    cmd命令行操作:
    django-admin startproject 项目名          # 创项目
    cd 项目名                              # 写换到该项目文件下
    python38 manage.py runserver ip:port     # 启动项目服务端
    
    """
    settings配置文件里面要修改
    [os.path.join(BASE_DIR,'template'),]
    """
    
  • app的概念

    app是django里面真正起作用的功能模块!!!
    
    1.创建app一定要去配置文件中注册!!!
    2.python38 manage.py startapp app01
    # cmd里面 创建app命令  记住要先切换到项目文件夹下!
    
  • django主要目录结构

    网址后缀			路由
    函数				 视图函数
    
    urls.py				路由层
    views.py			视图层
    templates			模板层
    models.py			模型层
    
  • django小白必会三板斧

    from django.shortcuts import HttpResponse,render,redirect
    HttpResponse 	返回字符串
    render		返回html页面
    redirect	重定向
    

今日内容概要

  • 静态文件配置
  • request对象方法
  • pycharm连接MySQL
  • django连接MySQL
  • django模型层初识
  • 基本ORM操作

今日内容详细

静态文件配置

1.编写一个用户登录页面
----------------------------------------------------------

2.静态文件
不怎么经常变化的文件 主要针对html文件所使用的到的各种资源:
	css文件、js文件、img文件、第三方框架文件!!!
---------------------
django针对静态文件资源需要单独开设一个目录统一存放!!!
	static目录,  该目录下如果各种类型的文件很多, 还可以继续创建目录
		css目录
		js目录
		img目录
		第三方插件文件目录(可以用utils目录/plugins目录/libs目录/others目录/或者不创就放在static目录下)
------------------------------------------------------------

3.资源访问
	我们在地址栏中之所以可以输入路由获取到相应的资源!!!
	是因为程序员提前开设了资源的接口!!!
------------------------------------------------------------

4.静态文件资源访问
	默认情况下无法访问!!!
	因为我们没有提前开设静态文件资源的访问接口!!!
------------------------------------------------------------

.明明导了本地的bootstrip的文件,为什么网页上面样式没了??
image
image
.
.
可以看出来,假如一个html页面,我们有使用到jquery和bootstrip代码对样式进行调整,当我们使用login路由登录网页时,首先触发视图层的login_func函数,该函数又触发login_page.html页面文件运行,html页面从上到下加载的时候,当运行到导入本地jquery与bootstrap文件里面的css与js代码时,会自动触发浏览器再发一个的GET请求,
比如当html文件加载到这一行时:
浏览器会自动请求网址 URL: http://127.0.0.1:8988/login/jQuery3.6.js
但是该自动请求的网址,并不能拿到我们起的ajango项目的服务器里面,对应的路径的文件夹里面拿对应的css或js文件!!!
因为在django里面urls.py文件里面我们并没有提前配好好对应的路由'login/jQuery3.6.js' 及视图文件里面与路由对应的视图函数!!!
也就是说只要urls.py文件里面我们并没有提前配好对应的路由及路由对应的视图函数名
浏览器就没有办法拿到服务器里面的对应的本地文件,所以就会报404
我们针对静态文件资源,并没有开设访问的接口,所以前端是没有办法访问到这些静态资源的!!
image
image
image
image
.
.
如何解决了?可以在urls.py文件里面一个一个的加路由与对应的函数,但是如果静态资源很多时,再一个一个的加路由就很烦了,django已经帮我们想好了,只要做一个配置
就可以自动把对应文件里面所有的静态文件全部配好对应的路由,这样前端通过浏览器正常发送请求就可以拿到对应的静态资源了!!!
.
.
settings文件里面最下面
STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static')]
这句话意思是:把static文件路径也添加到所谓的环境变量中,在后台已经悄悄的操作好了
这个时候html文件里面的导入那边的文件查找static文件名前就不需要写..了
image
image
image
.
STATIC_URL = '/static/' # 访问静态文件资源的接口前缀(通行证)!!
意思是:只有浏览器输入的网址的IP与端口后的路由是/static/
那么浏览器就已经有资格去访问STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static')]列表里面列举的所有的目录里面的资源(注意:两个static不是一个东西,上面的是路由或者叫接口前缀,下面的是在项目文件里面的static目录名!!!)

比如请求 URL: http://127.0.0.1:8988/static/bootstrap-3.4.1-dist/css/bootstrap.min.css
当发现后缀/static/对了后,就会拿后面的路径bootstrap-3.4.1-dist/css/bootstrap.min.css 去STATICFILES_DIRS列表里面依次找各文件目录下去对应的静态文件!!!
image
.
.

注意:!!!

 <link rel="stylesheet" href="/static7/bootstrap-3.4.1-dist/css/bootstrap.min.css">

注意在引入静态文件配置的时候static7代表的接口前缀或者说是路由,后面的才是静态文件的路径

配置文件里面:
STATIC_URL = '/static7/'   # 访问静态文件资源的接口前缀(通行证)!!
STATICFILES_DIRS = [
    os.path.join(BASE_DIR, 'static')   # 存储静态文件资源的目录名称!!
]

所以说假如我们的静态文件的文件夹叫static888,那么上面os.path.join(BASE_DIR, 'static')变成os.path.join(BASE_DIR, 'static888')
静态文件的引入还是<link rel="stylesheet" href="/static7/bootstrap-3.4.1-dist/css/bootstrap.min.css">

.
.

静态文件相关配置

STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static')]

1.接口前缀
STATIC_URL = '/xxx/'  # 访问静态文件资源的接口前缀(通行证)
STATICFILES_DIRS = [
    os.path.join(BASE_DIR, 'static'),  # 存储静态文件资源的目录名称
    os.path.join(BASE_DIR, 'static1'),  # 存储静态文件资源的目录名称
    os.path.join(BASE_DIR, 'static2'),  # 存储静态文件资源的目录名称
]
------------------
查找顺序:接口前缀正确之后, 会拿着后面的路径依次去到列表中自上而下查找,一旦找到就返回!!!
------------------------------------------------
2.接口前缀动态匹配!!!
原来html文件里面代码:

    <link rel="stylesheet" href="/static/bootstrap-3.4.1-dist/css/bootstrap.min.css">
    <script src = '/static/bootstrap-3.4.1-dist/js/bootstrap.min.js'></script>

------------------------------------------
改成:

{% load static %}   # 导入django自带的一个static.py模块文件
<link rel="stylesheet" href="{% static 'bootstrap-3.4.1-dist/css/bootstrap.min.css' %}">
<script src="{% static 'bootstrap-3.4.1-dist/js/bootstrap.min.js' %}"></script>

注意load后面的static 与{%后面的static 都是指的是static.py模块文件
和你的 访问静态文件资源的接口前缀static和存储静态文件资源的目录名称的static没有关系!!!

这样一改后,settings配置里面 STATIC_URL = '/static/'  接口前缀改一下,html页面里面对应的静态资源文件的导入时,接口前缀就会动态匹配, 比如STATIC_URL = '/xxx/'
上面的django代码不变,但是该代码转化成html里面的代码时,就会自动变了
<link rel="stylesheet" href="/xxx/bootstrap-3.4.1-dist/css/bootstrap.min.css">
<script src = '/xxx/bootstrap-3.4.1-dist/js/bootstrap.min.js'></script>
-----------------------------------------------

有时侯代码改了,服务器也重启了,但是浏览器还是没有响应,可能是浏览器用的是缓存,没有去请求服务端,需要在检查界面,点击设置按钮,在net work里面的禁用缓存选项给勾选上,这样在检查界面打开的时候,浏览器就不使用缓存,这样每一次浏览器向服务端发送网络请求都是真正的发,不用缓存了!!
image
image
.
.
.
.
.

form表单细节介绍

-----------------------------------------------------
action		控制数据提交的地址!!!
有三种:
	1.action=""     数据默认提交给当前页面所在的地址
	2.action="https://www.baidu.com/"     完整地址
	3.action="/index/"    朝当前服务端的路由index地址提交,比如本地的ip与端口是127.0.0.1:8988  那么action="/index/"  实际上就是 action="http://127.0.0.1:8988/index/"
------------------------------------------------------
method		控制数据提交的方法
	默认是get
	可以改post
------------------------------------------------------
请求方法补充
get请求:
	朝服务端索要数据,也可以携带一些额外的要求!!!
	携带额外数据的方式:  URL?xxx=yyy&uuu=zzz
	问号后面携带数据的大小是有限制(2KB)的并且不能携带敏感数据(比如密码等)
--------------------------------------------------------
post请求:
朝服务端提交数据
	携带额外数据的方式:  请求体
	请求体携带数据安全性较高并且没有大小限制!!!
---------------------------------------------------------
form标签里面的子标签必须要有name属性,不然GET请求都发不出去!!!


---------------------------------------------------------
前期发送post请求需要注释掉配置文件中的某一行
MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    # 'django.middleware.csrf.CsrfViewMiddleware',    # 要把这行注掉!!!
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

form标签里面的子标签input标签必须要有name属性,不然GET请求都发不出去!!!
name是字典的键,你写在输入框里面的就是键对应的值
image
image
image
.
method 属性不写默认就是GET 当给input标签添加过name属性后
image
image
点一下登录按钮后,可以看到网址变成了http://127.0.0.1:8988/login/?name=jason&pwd=123 就会以这种方式把数据name=jason&pwd=123发送到当前的这个http://127.0.0.1:8988/login/ 地址上去
问号?后面的东西不属于路由,不影响路由的匹配!!路由还是/login
image
.
.
image
image
image
显示权限不够,怎么解决?想发送post请求,必须要在settings.py里面注一行代码!!!
'django.middleware.csrf.CsrfViewMiddleware' 这行代码注掉就行了
image

当输入账号密码提交后,后端里面可以看到已经正常朝/login路由发送post请求了!!!
image
.
路由针对不同的请求方式是可以做不同的处理的!!!
.
.

思考

现在数据已经可以正常的发送到后端去了!!!
要想办法在后端视图函数处获取到用户发过来的数据!!!
image
.
如果发过来的是get请求,给浏览器返回html页面!!!
如果发过来的是post请求,想办法获取发送过来的数据!!!
.

request对象 重要!!!!

request是一个对象,该对象经过了两层封装,
第一层是wsgiref把原来的socket代码通过tcp流式协议收到的请求数据data封装成大字典了!!
第二层封装是django将大字典封装成了对象!!

---------------------------------------
补充:
form标签里面的input标签必须要有name属性,不然GET请求都发不出去!!!

而且注意当name只是input标签里面的一个属性名,真正重要的是name=后面的东西比如pwd或username这些才是真正的属性!!!
request.POST()拿到的字典里面就是比如pwd或者username这些name=后面的属性作为的键!
用户在输入框里面写的数据按submit按钮提交后就会变成字典里键对应的值!!!
----------------------------------------------------------------------
request.method	 获取当前请求方式 结果是纯大写的字符串数据!!!
	GET\POST
-------------------------------------------------------
request.POST	获取post请求请求体里面携带的数据!!!
	request.POST.get()           获取列表最后一个数据值!!!!!
	request.POST.getlist()         获取整个列表数据

getlist() 方法尤其适用于select下拉框标签,当用户在前端选择了多个数据提交后,post请求体里面是多个值,此时如果用get()就只能拿到列表最后一个数据值了,但是我们肯定要的是整个列表里面的数据,所有这种情况下必须要用getlist()方法了!!!
------------------------------------------------------
request.GET		获取网址问号后面携带的数据
注意:无论你是什么请求post请求也一样     都拿的是获取网址问号后面携带的数据
-----------------
	request.GET.get()            获取列表最后一个数据值!!!!!
	request.GET.getlist()            获取整个列表数据
------------------------------------------------------
"""
在视图函数中针对不同的请求代码编写套路
	if request.method == 'POST':
		return HttpResponse()
	return HttpResponse()
"""
--------------------------------------------------
def login_func(request):
    # print(request.method)
    if request.method == 'GET':
        # 1.返回html页面
        return render(request, 'login_page.html')
    elif request.method == 'POST':
        # 获取post请求的请求体里面的数据
        print(request.POST)
        name = request.POST.get('name')
        pwd = request.POST.get('pwd')
        print(name, type(name), pwd, type(pwd))
        return HttpResponse('数据我收到了!!!')
---------------------------------------------------

当在浏览器里面先输入网址,可以看到打印了get
当点击用户登录按钮后,可以看到打印了post
request.method 可以获取当前请求方式 结果是纯大写的字符串数据!!!
image
.
当我们在视图函数里面加各判断后,就可以根据收到的请求方式的不同,返回不同数据
get请求返回html页面 post请求返回字符串 数据我收到了!!!
现在一个视图函数就可以处理两种请求方式了!!!
image
image
image
.
.
request.POST 获取post请求请求体里面携带的数据是一个类似于字典的东西
image
image
.
.
可以看出request.POST.get() 拿到的是字典里面键对应的值列表里面的字符串!!!
image
.
.get()方法是获取值列表里最后一个数据值!!!
可以看到当我们设置了3个input标签后且属性名name都一样后,3个输入框里面的输入的用户名都被request.POST方法拿到放到键name对应的值列表里面了!!!
但是用request.POST.get('name') 拿到的只是列表里面最后一个数据值jerry
image
image
image
.
如果要拿值列表里面的所有值 request.POST.getlist()
image
.
.
image
第一次输入的网址 http://127.0.0.1:8988/login/
第二次输入的网址 http://127.0.0.1:8988/login/?hobby=read&lover=nimadan
可以看到 request.GET 获取到了网址问号后面携带的数据
image
.
.
注意:无论你是什么请求post请求也一样 都拿的是获取网址问号后面携带的数据
要把form标签里面的action属性要改成/login/?hobby=read&lover=nimadan
这样你一点登录才会把数据往/login/?hobby=read&lover=nimadan路由地址提交
这样才能拿到网址问号?后面的数据!!!
image
image
image
.
.
request.POST.get() 获取的还是列表最后一个数据值!!!!!
.image
image
.
.
目前我们已经实现了在后端能正常拿到前端输入的数据了!!!
虽然目前我们的后端服务器是在自己电脑上运行的,前端在自己浏览器上运行的!!!
以后服务器可能在十万八千里远的地方运行,这时候我们通过前端浏览器就可以基于网络将数据发给很远地方的后端服务器了!!!
.
.

现在前端浏览器的数据可以正常的通过网络被后端服务器拿到了
就可以简单的实现前后端的互动了

views.py 文件
from django.shortcuts import render, HttpResponse, redirect
def login_func(request):
    if request.method == 'POST':
        name = request.POST.get('username')
        pwd = request.POST.get('pwd')
        # 现阶段:后端获取到的前端数据,一般都是字符串
        if name == 'jason' and pwd == '123':
            return HttpResponse('用户登录成功')
        return HttpResponse('用户名或者密码错误')
    return render(request, 'login_page.html')  # 暂时认为不是POST请求就是GET请求
-----------------------------------------------

image
image
上面的代码已经把用户名与密码的固定死了,实际情况肯定不可能这样写!!!
所以我们要用数据库了!!!
.
.
.
.

pycharm连接数据库

1.pycharm初次连接数据库 需要下载对于的驱动  不同的数据库软件要下载不同驱动!!

2.参考群内截图操作即可

3.也支持一些简单的增删改查操作!!!

pycharm连接数据库操作:
点击右上角或者坐下角图标 database
image
image
.
image
.
image
.
先用默认的驱动,不行再换其他的驱动
image
.
输入数据库的用户名密码,要操作的具体的库名,数据库的ip地址 端口号等
点一下Test Connection 按钮测试一下看能不能连上 相当于一个小型的socket服务端
不成功就换驱动,成功了点下apply 再点下ok就行了!!!
image
image
image
.
image
image
.
.
3.也支持一些简单的增删改查操作!!!增一条数据,减一条数据,也可以直接改数据
绿色的小箭头就是提交到数据库里面去!!!
image
.
.
.

django连接数据库 重点!!!

django自带的sqlite3是一个小型的数据库 功能比较少 主要用于本地测试
我们实际项目中都会替换掉它!!!
----------------------------------------------------------
settings文件里面修改配置:

这是默认配置:
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}
----------------------------------------------------------
修改默认配置为:

DATABASES = {
    'default': {
            'ENGINE': 'django.db.backends.mysql',
            'NAME': 'day51',
            'HOST': '127.0.0.1',
            'PORT': 3306,
            'USER': 'root',
            'PASSWORD': '123',
            'CHARSET': 'utf8'
        }
}
------------------------------------------------------------
此时 django连接mysql启动报错!!!!!!

2.需要指定模块
	django1.X版本需要在项目目录下或者app目录下的__init__.py编写代码
    	import pymysql
    	pymysql.install_as_MySQLdb()
----------------
	django2.X及以上都可以直接通过下载mysqlclient模块解决!!!!!!
    	pip3.8 install mysqlclient
	ps:该模块windows下载问题不大
	主要是mac电脑可能有问题:
--------------------------------------------------------------

默认配置:
image
.
修改后的配置为:
image
.
此时 django连接mysql启动报错 需要下载指定模块mysqlclient
image
image
.
主要是mac电脑下载模块mysqlclient可能有问题:
image
解决办法:点击源码 改解释器里面源码 decode改成encode 就行了!!!
image
image
.

这样django项目就能连接上mysql了!!!

.
.
.
.

ORM对象关系映射

对象关系映射器(Object Realtion Mapping)是一种代码库,它能自动将存储在关系型数据库表中的数据转化成在应用程序代码中更加常用的对象。

通过ORM我们可以通过类的方式去操作数据库,而不用再写原生的SQL语句。
通过把表映射成类,把行作为对象,把字段作为属性。
ORM在执行对象操作的时候最终还是会把对应的操作转换为数据库原生语句。

--------------------------------------------
ORM的作用:
能够让不会SQL语句的python程序员
使用python面向对象的语法来操作数据库
用它能够极大的提高开发的效率,只需要专注于python代码的编写就行了,sql就不用管了
----------------------------------------------------

将类  映射成  一张表
操作类就是在操作表,创建一个类就是在创建一张表!!!
------------------------

将类产生的对象    映射成    表的一条条数据
也就是说用类产生了一个对象      相当于从表里面拿了一条数据
------------------------------------------------------

对象点名字   相当于   数据获取字段对应的值
------------------------------------------------------
怎么理解了
如果用了ORM,在进入mysql的对应的库里面后,在里面输入命令 class User:  就相当于帮你用sql语句
create table User(字段名 字段类型 约束条件,字段名2 字段类型2 约束条件2);
创建了一个User表!

用类产生一个对象User()    就相当于从User表里面拿一条数据!!!
用对象去点 User().name    就相当于拿这条数据中name字段对应的值!!!

这样就算不会sql语句也能操作数据库了!!!
------------------------------------------------------
ORM由于高度封装了SQL语句!!!
所以有时候效率较低, 我们需要自己写SQL语句!!!

.
.
.
.

ORM基本操作

如果想写ORM必须要到应用下的models.py模型层和数据库打交道的地方
image

1.先在models.py中编写模型类
from django.db import models

# Create your models here.
# 这个地方创一个类对应的就是到mysql里面创一个表了!!
# 写的类必须要继承模块里面的Model类,只有继承了它
# 才有资格将所写的类映射成一张表!!!
class GirlsInfo(models.Model):
    # 相当于sql语句 id int primary key auto_increment
    id = models.AutoField(primary_key=True)   # 字段名 = 字段类型 + 约束条件
    # 相当于sql语句 name varchar(32)
    name = models.CharField(max_length=32)
    # 相当于sql语句 age int
    age = models.IntegerField()


注意在括号里面只要不写null=True,那么该字段默认就是不能为空
---------------------
常用字段:
AutoField
int自增列,必须填入参数 primary_key=True。当model中如果没有自增列,则自动会创建一个列名为id的列。

IntegerField
一个整数类型,范围在 -2147483648 to 2147483647。(一般不用它来存手机号(位数也不够),直接用字符串存,)

CharField
字符类型,必须提供max_length参数, max_length表示字符长度。

DateField  日期字段

DateTimeField  日期时间字段

-----------------------
字段参数
null  用于表示某个字段可以为空。字段括号里面不写null=True  就默认为该字段不能为空

unique  如果设置为unique=True 则该字段在此表中必须是唯一的 。

default   为该字段设置默认值。
---------------------------------------------
Field有字段的意思
此时模型类虽然创好了,并不会立即起作用!!!
但是还没法在数据库里面根据该模型类创建表!!!
----------------------------------------------

.

数据库迁移 migrate 移动(v)

直接在pycharm里面的Terminal里面输入命令!!如果在cmd里面要切到项目名的文件夹下

执行数据库迁移相关命令

python38 manage.py makemigrations    # 记录命令!!
# 将ORM操作记录到(migrations目录下的文件里)以后会有用!!!

python38 manage.py migrate    # 数据库迁移命令,将操作同步到数据库上!!!

-------------------------------------------------------------
注意!!!!重中之重!!!!!!!!!!!!!!!!!!!!!!!!

每次在models.py 文件中, 修改了与数据库相关的代码,都需要再次执行上述命令!!!!!!!

不然的话  models.py 里面的命令就与数据库里面的数据不对应了

-------------------------------------------------------------

image
.
此时migrations里面会多一个文件,这就是一个记录文件,
比如现在想用ORM与数据库做操作,所有的操作,都会被记录下来,都会用代码记录在该文件里面!!!
image
.
.
数据库迁移命令,将操作同步到数据库上!!!
image
数据库里面该girlsinfo表就创建成功了!!!还会多创了许多表暂时不用管!!!
girlsinfo 前面多加了应用名,是django自动帮加的,注意是怕你一个django项目里面不同的app应用里面创表的时候可能会创一样的表名,这个时候前面有个应用名就可以区分了!!!
image
.
.
.
.
表有了接下来就开始往表里面写数据了!!!

ORM基本语句

--------------------------------------------------------
--------------------------------------------------------
from app01 import models
models.类名.objects.create()     # 往表里面创建数据 就是往数据库表里面添加数据!
models.类名.objects.filter()     # 查询数据
# 就是拿获取的前端的数据到数据库表里面对应的字段名下查找,看有没有一样的,如果有将这一整条数据,以列表套数据对象的形式返回出来!!!
-------------------------------------------------------
--------------------------------------------------------
models.类名.objects.update()     # 修改数据

models.类名.objects.delete()
--------------------------------------------------------
--------------------------------------------------------
# 往表里面创建数据!!!

from django.shortcuts import render, HttpResponse, redirect
from app1 import models       # 必须要把models文件导过来!!!

def login_func(request):
    if request.method == 'POST':
        name888 = request.POST.get('username')
        pwd777 = request.POST.get('pwd')
# 1.往表里面创建数据 等价于sql语句
# insert into GirlsInfo(name,age) values (name888,pwd777);
        models.GirlsInfo.objects.create(name=name888,age=pwd777)
    return render(request, 'login_page.html')
---------------------------------------------------------------
---------------------------------------------------------------
# 到表里面查询数据!!!

def login_func(request):
    if request.method == 'POST':
        name888 = request.POST.get('username')
        pwd = request.POST.get('pwd')
        # 2.查询数据
        res = models.GirlsInfo.objects.filter(name=name888)
        print(res)  # 拿到的就是列表套数据对象[数据对象,]
        print(res[0])  # 就是拿列表里面数据对象!!
        print(res[0].id)  # 拿该对象对应的id的值
        print(res[0].name)
        print(res[0].age)
---------------------------------------------------------------
---------------------------------------------------------------
# 修改表里面的数据!!!

def login_func(request):
    if request.method == 'POST':
        models.GirlsInfo.objects.filter(id=3).update(name='阿崩', age=666)
    return render(request, 'login_page.html')
---------------------------------------------------------------
---------------------------------------------------------------
# 删除表里面的数据

def login_func(request):
    if request.method == 'POST':
        models.GirlsInfo.objects.filter(id=3).delete()
    return render(request, 'login_page.html')
---------------------------------------------------------------

此时就实现了前端输入数据点提交按钮后,后端通过request.POST.get()拿到前端的数据
然后通过models.GirlsInfo.objects.create(name=name,age=pwd)
将数据传到数据库里面去了!!!
image
.
image
image
.
.
models.类名.objects.filter()
image
返回值res 拿到了 <QuerySet [<GirlsInfo: GirlsInfo object (3)>]>
GirlsInfo object 类的对象 其实就是数据对象!!
object (3) 就是告诉你表里面有3条数据!!!
image
image
.
.image
image
image
.
.
models.类名.objects.filter()
可以看出来该命令会把从前端获取的数据,到数据库里面按照字段名去找对应的数据,
如果找到了就会放在列表里面的第一个,用索引0就可以取到了!!!
image
image
image
.
.
如果输一个,不在数据库里面的名字时,可以看到会报列表索引超出范围!!!list index out of range 因为res拿到的<QuerySet []> 列表是个空 所以后续索引0就拿不到对象了!!
image
image
image
.
.
可以看出来虽然我输入的用户名是阿伟,但是没用,因为我们是拿的是前端提交的密码作为数据到数据库里面的age字段里面去查找的!!!前端密码我们输的是8888 所以最后找到了数据库里面阿牛那一行数据对象了!!!
所以models.类名.objects.filter() 括号里面的关键字实参前面的关键字 对应的就是数据库里面的字段名 关键字写什么就会到表里面对应的字段名下去查数据!!!
image
image
image
.
.
models.类名.objects.update() # 不加筛选条件就是修改表里面的全部数据!!!
models.GirlsInfo.objects.filter(id=3).update(name='阿鸡', age=99999)
注意filter()如果筛选条件不精确就是一个批量筛选,就会导致后面的修改变成一个批量修改!!
筛选出id等于3的那条数据,再将那条数据里面的name字段对应的数据改为'阿鸡' age字段对应的数据改为99999
修改数据前一定要筛选数据就类似于sql语句一样
update 表名 set 字段名=新数据 where 筛选条件;
因为后端的代码里面没有用到前端输入的数据,所以前端写啥提交都无所谓了
image
image
image
image
.
.
.
models.类名.objects.delete() # 不加筛选就是删除表里面所有的数据

也是要加一下筛选条件再删数据!!
models.GirlsInfo.objects.filter(id=3).delete()
image
image
image
image
.
.
.

作业

1.编写用户数据的展示、创建、删除
2.尝试预习ORM其他操作及关系创建
3.整理本周内容
posted @ 2022-12-09 15:36  tengyifan  阅读(60)  评论(0)    收藏  举报