django整套流程

先总体走一遍django流程
        登陆功能为例
            静态文件配置
            form表单提交数据后端如何获取
            request方法
            pycharm连接数据库  django使用mysql数据库
            django orm简介
            表字段的增删改查
            表数据的增删改查
知识兔

一、静态文件配置

1.创建准备

创建项目,创建APP,settings中注册app,创建templates文件夹并去settings中注册该文件

INSTALLED_APPS = [
                'django.contrib.admin',
                'django.contrib.auth',
                'django.contrib.contenttypes',
                'django.contrib.sessions',
                'django.contrib.messages',
                'django.contrib.staticfiles',
                # 'app01'  # 简写
                'app02.apps.App02Config'  # 全称
            ]
知识兔
app的概念
            django其实就是一个专门用来开发app的web框架
            一个空的django的项目就类似于是一所大学
            app就类似于大学里面的各个学院
            比如你的选课系统(学生,老师,管理员)
            在比如你的优酷项目(普通用户,vip用户,管理员)
            大白话:针对不同的功能模块 你就可以开设不同的app去处理实现程序的解耦
            并且更好的实现分组开发    
知识兔

2.创建路由

 3.创建视图函数

 4.写模板文件

网址所用到的html文件通常都是放在templates文件夹下
网站所用到的静态资源通常都是放在static文件夹下

 启动项目:

用户可以访问的资源 都在url中(******)
知识兔

浏览器之所以能够输入网址访问到对应的资源,是因为后端开设了资源的访问接口(url),
django在何处可以开设接口??? 接口都在urls.py路由与视图函数对应关系中


后端资源一般都需要手动指定是否需要暴露给用户,因为没有暴露static给用户,浏览器无法访问资源,
按理说,我们应该在urls文件中给static文件夹配置路由
但是django给我们提供了更好的方式,只需要在配置文件中配置静态路径就可以了
知识兔

5.配置静态路径(******)

对于前段已经写好了的文件 我们只是拿过来使用 那么这些文件都可以称之为叫"静态文件"
   1. 静态文件可以是
        bootstrap一类的前段框架 已经写好了的
        图片
        css
        js
   2. 静态文件默认全都放在static文件夹下
        static文件夹中默认会默认创建的子文件夹
            css文件夹  当前网站所有的样式文件
            js文件  当前网站所有的js文件
            img文件  当前网站所有的图片文件
            其他(前端框架代码 第三方插件代码...)
知识兔
静态文件配置
知识兔

STATIC_URL = '/static/' # 仅仅是访问静态资源的接口前缀,要想访问静态资源url就必须以/static/打头,后面跟上文件路径,和下面的static含义不一样
STATICFILES_DIRS = [
  os.path.join(BASE_DIR,'static'), # 文件夹,一旦你是以接口前缀开头的 那么就会自动拿着接口前缀后面的文件路径来列表中的一个个文件夹中(static、static1...)查找文件
  os.path.join(BASE_DIR,'static1'),
  os.path.join(BASE_DIR,'static2'),
]

 ps:清除缓存

django默认是支持自动重启代码的 所以你只需要多刷新几次页面就可以,但是有时候它的重启机制比较慢
机制:实时监测文件代码变化 只要有变化 就会自动重启 ,可能你的代码还没有写完 这个时候就会自动报错
知识兔

6.静态文件接口前缀"动态解析"

静态文件接口前缀本来是/static/但是假如说领导要求换成/xxx/怎么办呢?手动修改每一个html?那么有一千个html文件呢?所以我们需要动态获取
知识兔
1.原生
知识兔
<link rel="stylesheet" href="https://zhishitu.com">
<script src="/static/bootstrap-3.3.7-dist/js/bootstrap.min.js"></script>

2.利用解析器,动态获取接口前缀
{% load static %}
<link rel="stylesheet" href="https://zhishitu.com"color: #ff6600;">{% static 'bootstrap-3.3.7-dist/css/bootstrap.min.css' %}">
<script src="/{% static 'bootstrap-3.3.7-dist/js/bootstrap.min.js' %}"></script>
静态文件路径动态解析            {% load  static %}            {% static '文件路径' %}

二、登录页面

1.html完善(form表单提交数据)

form表单提交数据           1. action                1.不写默认朝当前url(http://127.0.0.1:8080/index/?id=1)提交                2.只写后缀/index/或者/index/?id=1                3.写全路径(你这个form要往其他网站的url提交数据)          
      2. method 默认是get请求,需要改为post
3. get请求和post请求携带参数的特点 get请求是直接在url后面?开头以&连接多个条件 /index/?id=1
&username=jason(get请求携带的参数大小是有限制的) 而post请求数据是放在请求体中的
可以通过method改为post请求改成post请求之后 需要去settings文件中注释掉一个中间件

 2. request 获取前端数据

form表单提交数据目的地由action        1.不写的情况下 默认往当前地址提交        2.还可以写后缀/index/(将项目常用这种)        3.还可以写全路径
我们这里是post请求,并且action是空的,数据会自动提交给当前路经,即视图函数 login,对于不同请求我们分开处理
request方法初识            request.method  获取前端请求方式(GET/POST)  全大写的字符串形式            request.GET     获取get请求携带的所有的数据,类似于是一个大字典,值为列表            request.POST    获取post请求携带的所有的数据,类似于是一个大字典,值为列表                取值分为两种                    request.POST.get('hobby')  默认取列表最后一个元素                    request.POST.getlist('hobby')  直接将列表原封不动的取出

3. pycharm连接数据库 

前端的数据接收完毕,接下来就是获取数据库数据来进行比对,首先来连接数据库

侧边栏database连接你想要操作的数据库  pycharm充当数据库的客户端

      

           

 4.django 连接数据库(******)

# django默认使用的是自带的sqlite数据库,该数据库对日期不是很精确 
DATABASES = {    'default': {        'ENGINE': 'django.db.backends.sqlite3',        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),    }}       
第一点: 如果你想让它其他的数据库  需要修改settings配置文件中配置
1. settings文件中配置        DATABASES = {    'default': {        'ENGINE': 'django.db.backends.mysql',        'NAME': 'day38',        'HOST':'127.0.0.1',        'PORT':3306,        'USER':'root',        'PASSWORD':'123',        'CHARSET':'utf8'    }}

第二点:如果此时启动项目会报错,说你没有导入mysqldb模块,这个模块已经不使用了,我们直接导入pymysql

2.还要在项目名下的init文件或者是应用名下的init文件中告诉django不要使用默认的mysqldb连接mysql,而是使用pymysql    import pymysql    pymysql.install_as_MySQLdb()

5.django orm 简介(数据库迁移)

强调:django orm不会帮你创建库,需要你自己手动创建库,它只能帮你创建表(建议你一个django就新建一个数据库)

1.首先需要在应用下的models.py中书写模型类        class User(models.Model):            # django会默认给你的表创建一个名为id的主键字段            # id = models.AutoField(primary_key=True)  # 一旦你自己指定了主键字段 那么django就不会自动再帮你创建了            username = models.CharField(max_length=32)  # username varchar(32)   CharField必须要指定max_length参数            password = models.IntegerField()  # password int

2. 需要执行数据库迁移(同步)命令才能修改数据库(******) python3 manage.py makemigrations # 仅仅是在小本本上(migrations文件夹)记录数据库的修改 并不会直接操作数据 python3 manage.py migrate # 将数据库修改记录 真正同步到数据库 注意:只要动了models中跟数据库相关的代码 就必须重新执行上面的两条命令 缺一不可(******)
  

当你熟练掌握之后 你可以采用简写的方式
  tools
    run manage.py task

         

 三、表单操作

1.表字段增删改查

表字段的增删改查        增            当一张表已经创建出来之后 后续还想添加字段,可以有两种方式                1.给新增的字段设置默认值                    addr = models.CharField(max_length=32,default='China')  # default该字段默认值                2.给新增的字段设置成可以为空                        age = models.IntegerField(null=True)  # 该字段允许为空                         删 (慎用)            删除字段 直接在models.py中注释该字段 然后重新执行两条迁移(同步)命令即可            注意:执行完之后 表中该字段所对应的所有的数据全部删除                 一般情况下 基本是不会用到真正意义上的删除

 2.表记录的增删改查

#查询

表记录的增删改查    操作django orm都是以模型类名作为开头    先导入 from app01 import models        以用户的增删改查为例                先连接数据库展示所有用户信息    1.获取模型表中所有的数据        models.User.objects.all()  # 结果也是querySet对象    只要是queryset对象 就可以点query查看内部sql语句    2.筛选相应的数据        1.直接获取对象的            models.User.objects.get(**kwargs)  # 条件不存在  立刻报错  不推荐使用        2.获取querySet对象的(                       1.querySet对象你可以把它看成是一个列表 里面放的是一个个的数据对象                       2.querySet对象支持索引取值和切片操作 但是不支持负数 也不推荐你使用索引取值                       建议你使用封装好的方法            )            queryset = models.User.objects.filter(**kwargs)  # 括号内多个参数是and的关系            user_obj = querySet.first()  # 没有也不会报错  直接返回None

# queryset 对象

"""1.res = models.User.objects.filter(username=username,password=password) filter查询出来的结果是一个"列表 列表内放的才是一个个的数据对象本身" 当查询条件不存在的时候 不会报错 只会返回一个空列表 filter括号内 支持写多个参数  并且参数与参数之间是and的关系2.querySet对象 支持正数索引取值支持切片,但是不推荐索引取值,一旦为空索引取值会报错(切出来的结果还是一个querySet对象) (如你通过名字查找有三个同名的列表里面会有三个对象,可以索引取值也可以切片取前两个对象),如:res[0:2]3. user_obj = models.User.objects.filter(username=username).first()  # 拿列表中第一个数据对象  用first虽然内部源码也是按照索引取值返回出来,但是没有数据时也不会报错,只会返回None4.print(res.query)  # 只有querySet对象才可以直接点query查看年内部对应的sql语句,    filter拿到的结果就是一个querySet对象(你现在只需要知道filter拿到的结果就能够点query查看sql语句)    如:print(res.query)                 SELECT `app01_user`.`id`, `app01_user`.`username`, `app01_user`.`password`                  FROM `app01_user`                  WHERE (`app01_user`.`username` = jason AND `app01_user`.`password` = 123)"""

#登录—— 获取数据库数据进行比对

user_obj = models.User.objects.filter(username=username).first()  # 拿列表中第一个数据对象if user_obj:    if user_obj.password == password:        return redirect('http://www.xiaohuar.com') #登陆成功重定向到网站return HttpResponse('用户不存在 ')

#增

1.create()方法    res = models.User.objects.create(username=username,password=password)  # insert into user(username,password) values(username,password)    # create方法能够新增数据 并且有一个返回值,返回值就是新增的数据对象本身        # print(res.username)        # print(res.password)2.利用对象的绑定方法    user_obj = models.User(username=username,password=password)    user_obj.save()    

#注册功能

(先写urls路由与函数对应关系,再写注册html页面,再写注册函数新增用户)

#删和改

3.修改用户    1.利用queryset对象的update批量修改的方法        models.User.objects.filter(age = 18).update(**kwargs)  # 会将queryset中所有的数据全部修改        2.利用对象修改属性的方法        user_obj = models.User.objects.filter(**kwargs).first()        user_obj.username = 'jason'        user_obj.save()  # 该方法 会将数据库中所有的字段全部重写修改一遍 效率极低 不推荐使用4.删除用户(不会真正删除数据  通常都是给数据加一个表示是否删除的字段)    1.利用queryset对象delete批量删除        models.User.objects.filter(age = 18).delete()  # 会将queryset中所有的数据全部删除

#修改功能

 #删除功能

计算机