概要

django小白必会三板斧

静态文件及相关配置

request对象方法

pycharm连接MySQL

django连接MySQL

django orm操作

内容

1.django小白必会三板斧

# 启动django项目之后 如何添加更多的功能
回想之前自己编写的web框架 如果要添加功能 就要去路由层urls.py和视图层views.py中去添加

#在路由层urls.py中django自带一个路由与视图函数对应关系(admin后台管理功能)
ps:在今后的python学习中 我们需要具备一定的推导能力(模仿、猜测、由已知推未知的能力培养)

# 在视图层views中 需要自己写好 
from django.shortcuts import render,HttpResponse,redirect

# django自带重启功能
当识别到项目中代码有变化之后 隔段时间会自动重启 但是有时候会比较慢

# 与浏览器打交道的视图函数都应该有返回值 常见的就是下列中django的三剑客 render HttpResponse redirect
HttpResponse  主要是用于返回字符串类型的数据
render       主要是用于返回html文件 并且支持模板语法 (django自己本身写的)
redirect     主要用于重定向 括号内可以写其他网站的全称 也可以写自己网站的后缀

2.登录功能

"""
我们之所以可以在浏览器地址栏中输入不同的路由访问到不同的资源 是因为我们在后端框架中提前开设了相应的访问接口 所以用户才能访问
言外之意就是我们没有开设接口 那么肯定访问不到"""

# 1.开设接口返回登录界面
# 2.登录界面需要使用bootstrap并且还需要自己编写css和js

静态文件
在编写完成后不会经常被修改的与html页面相关的文件
css文件 js文件 图片文件 第三方框架文件(bootstrap)上述文件都可以称之为是'静态文件'
在django中静态文件单独开设一个文件夹存储 默认叫static文件夹
在该文件夹内还可以根据功能的不同继续划分不同的文件,比如: css文件 js文件 img文件 others文件夹

# 3.页面需要获取前端用户数据并且传递给后端
需要使用的form表单
action参数:控制数据的提交地址
method参数:控制请求的提交方式
# 4.访问登录页面
静态文件全部显示资源不存在时 http://127.0.0.1:8000/static/bootstrap-3.3.7-dist/css/bootstrap.min.css 出现这问题的原因是因为我们并没有开设静态资源访问的接口
# 5.开设静态资源的访问接口
理论上应该自己去路由层开设接口资源 但是由于静态文件资源使用频率很高
只要是一个web项目部都肯定需要 所以django为了避免开发者繁琐 提供了静态资源的配置文件 只需要填写固定的配置即可开设资源接口
settings.py
	# 静态文件资源访问接口固定配置
    STATICFILES_DIRS = [
        os.path.join(BASE_DIR,'static')
    ]
    # html页面路径
    /static/mycss.css
# 6.配置文件中存在的两个问题?
第一:在我们配置接口的上一行的STATIC_URL = '/static/' 它的作用是什么?
第二:就是在  STATICFILES_DIRS = [] 中 为什么最后得到是一个列表?(我们都知道列表是用来存储多个元素的)

答案:"""
以该地址为例:/static/bootstrap-3.3.7-dist/css/bootstrap.min.css
     /static/其实是一个接口前缀 相当于暗语一样 表示具备访问静态文件资源的权限 只有当具备了权限之后才能拿着接口前缀后面的文件路径去列表中的每个文件中去查找 一般查找顺序是从上到下 只要找到一个就会结束 比如 static和static1里面都有a.txt 那么只会拿到static中的
     大白话理解:就是先对暗号 暗号对上了才有接着往下查找的权限 然后暗号对上了再用前缀后面的文件路径去文件中去查找 只要找到一个就会自动结束 """

# 7.接口前缀动态绑定
	如果templates中有很多html文件并且都需要引入静态资源
    现在把接口前缀修改了 那么会造成什么后果?
    后果: 会造成页面无法加载资源 因为暗号对不上 所以为了解决这个问题的办法是直接将接口前缀动态绑定 这样不管前缀如何变化 都能随着前缀的变化而变化
   动态绑定代码: 
    {% load static %}
    <link rel= "stylesheet" href="{% static 'bootstrap-3.3.7-dist/css/bootstrap.min.css'%}">

3、request对象方法

"""
提交post请求 默认会报错403
前期不需要过多考虑 直接去配置文件中注释掉一行即可
		MIDDLEWARE = [
    	# 'django.middleware.csrf.CsrfViewMiddleware',
		]	
"""
1.因为get请求和post请求都会触发同一个视图函数login的运行
 如何解决针对不同的请求执行不同的代码?
    方法:通过print(request.method)我们发现出现的结果是大写的GET和POST 所以我们想到用流程控制的方法来解决这个问题
    代码编写:  if request.method == 'GET':
            return render(request,'login.html')
        	elif request.method == 'POST':
                return HttpResponse('默默的奋斗才是王道 有了成就就才有发言权')
2.获取当前请求方式
request.method   返回的是纯大写的请求方法字符串
"""由于get请求更加常见 post请求更加次之 所以还可以按照下列方式简写 
if request.method == 'POST':
	return HttpResponse('默默的奋斗才是王道 有了成就就才有了发言权')
	# 默认让视图函数处理get请求
     return render(request,'login.html')
 """
3.如何获取post请求提交的普通数据
request.POST   结果是一个QueryDict  可以看成字典处理 # QueryDict:{'username':['jason'],'password':['123']}
request.POST.get('username')   # jason
request.POST.getlist('hobby')  # 拿到的是整个列表
"""
get方法会拿到值列表中最后一个元素 而不是整个列表   
getlist方法会直接拿到整个值列表
"""

4.如何获取url后面携带的数据
request.GET  结果是一个QueryDict 也是可以看成一个字典处理
request.GET.get('info')
request.GET.getlist('cityList')
这个特征与上述request.POST基本一致 使用场景也很多
	https://www.lagou.com/wn/jobs?kd=python&isSchoolJob=1&city=%E4%B8%8A%E6%B5%B7&pn=1

4、pycharm连接MySQL

"""其实pycharm也可以充当很多数据库软件的客户端"""
在pycharm中数据库的位置
1.pycharm右上方侧边 database
2.pycharm左下方边角 database
3.上述两个地方都没有 需要下载插件 或者直接重新下载安装一个正常的pycharm
settings>>>>>>plugins>>>>>>然后搜索database>>>>最后下载app即可

# 连接数据库
1.选择数据库
2.首次连接需要下载驱动
需要下载 download driver.....
3.测试连接如果不通过 则需要还驱动重新下载使用
Driver: MySQL for 5.1
然后进去后可以打开我们之前的MySQL数据库中的表 然后可以在pycharm中可以加减新增表数据

5、django连接MySQL

"""
django默认自带一个sqlite3数据库 但是存在本身功能很少 所以仅仅把这个数据库用于本地测试的作用"""
1.默认配置
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}
2.修改配置
DATABASES = {
    'default': {
        'ENGINE':'django.db.backends.mysql',
        'NAME': 'jp_05',
        'HOST': '127.0.0.1',
        'PORT':3306,
        'USER':'root',
        'PASSWORD':'jason123',
    }
}
3.指定模块
	在项目同名的文件夹内的__init__.py中
    或者应用名的文件夹内的__init__.py中
    添加一行固定的代码
    import pymysql
    	pymysql.install_as_MySQLdb()

6、django orm简介

ORM:对象关系映射
# 特点: 就是能够让不会写SQL的python程序员使用python语法就可以直接操作MySQL 大实话:用python语法代码来直接操作MySQL 
优势:提升了开发效率
劣势: 封装了SQL语句 有时候可能效率不高 还需要人为编写SQL调优

概念:
    表                    类
一行行数据             类产生的一个个对象
数据字段               对象的一个个属性

7、orm基本使用

# 如果需要使用ORM 需要去应用下的models.py中编写代码 其中models.py文件我们也称之为是模板层文件 专门是用来与数据库层面进行数据交互
1.编写类代码
class Users(models.Model):
uid = models.AutoField(primary_key=True)  # 等价于uid int primary key auto_increment
name = models.CharField(max_length=32)  # 等价于MySQL中的 name vachar(32)
pwd = models.IntegerField()  # 等价于pwd int

2.执行数据库迁移命令
python3 manage.py makemigrations  # 这项命令只能记录操作的作用
python3 manage.py migrate  # 将操作迁移到数据库

首次执行的是迁移命令 django还会自动创建一些默认需要使用到的表
注意:1.只要是修改了models.py模型层文件中与数据库相关的代码 那么就需要重新执行数据库迁移命令 这两句迁移命令是必须同时存在的 
      2.在写uid的时候 主键(primary-key)是可以省略的 写的时候需要注意一下就可以了 

3.表名的特征
Users
app01_users
由于django支持多个应用 为了区分不同应用下可能会出现相同的表名
所以自动在前面加上了应用的前缀 因为同一个应用下不可能出现相同的表名(只要你是个正常的人都不会取相同的表名)

4.扩展
1.表的主键可以不写 orm会自动帮你写一个名为id的主键
2.每次修改了跟数据库相关的python代码 都需要重新执行迁移命令
针对两个迁移命令 可以采用pycharm提示功能编写
tools  
run manage.py task

8、数据操作

首先先导入该模型文件
from app01 import models 然后就可以对文件里面的数据进行增删改查
# 1.增
user_obj = models.Users.objects.create(name='jack',pwd='333')
print(user_obj)
print(user_obj.uid)
print(user_obj.name)
print(user_obj.pwd)

# 2.查
res = models.objects.filter(name='jason')
print(res)  # <QuerySet [<Users: Users object>]>
 print(res[0])  # Users object
 print(res[0].uid)  # 1
print(res[0].name)  # jason
pkrint(res[0].pwd)   # 123

# 3.改
models.Users.objects.filter(uid=1).update(name='jasonNB')
都是先查找数据filter然后再改update数据

# 4.删
models.Users.objects.filter(uid=3).delete()
先查找filter数据 然后再delete删除数据