一、静态文件的配置
'''
我们之所以在浏览器上输入不同的路由可以访问到不同的内容
是因为我们提前在url(路由层)中开设了想要的资源接口
如果访问不到那么就是没有开设
'''
# 我们可以编写一个登入功能
# 1.开设登入界面接口
# 2.登入界面需要使用bootstrap渲染页面或则自己编写css文件
'''而这些写了之后不怎么需要改动的文件 就可以称之为静态文件
我们一般把这些静态文件放在static文件中
然后根据功能的不同还可以分为不同的文件夹
1.第三方框架
2.css文件夹
3.js文件夹
4.img文件夹
...
然后根据页面的不同这些文件也还能在细分
就是为了能够好管理'''
# 3.然后在页面上的cdn导入的标签都可以删除了 变成本地导入即可
/static/bootstrap-3.4.1-dist/css/bootstrap.min.css
# 4.但是这个时候访问页面 渲染页面的路径没加载成功
http://127.0.0.1:8000/static/bootstrap-3.4.1-dist/css/bootstrap.min.css 静态文件访问不到
因为我们并没有开设静态资源访问的接口
# 5.开设静态文件访问接口
'''按理说我们应该去url.py文件中去开设一个接口文件的 但是静态文件资源使用频率很高 所以
只要是一个web项目肯定都需要 所以django为了避免开发者繁琐 提供了静态资源的配置文件 只需要填写固定的配置即可开设资源接口
在stiings中下添加下列固定代码
STATICFILES_DIRS = [
os.path.join(BASE_DIR, 'static')
]'''
# 6.配置文件中有一个配置
STATIC_URL = '/static/'
STATICFILES_DIRS = []
'''就是第一个配置有什么作用
为什么设置静态文件需要用到列表'''
1.第一个是接口前缀
/static/bootstrap-3.4.1-dist/css/bootstrap.min.css
'''当在页面上写上这个接口前缀才能找到静态文件一旦html上的导入样式的路径前缀跟配置文件不一样就会找不到
这个路径的前缀如果跟配置文件中一样那么就会那这后面的路径与下面的列表中对比如果有就会找到 没有就找不到页面就渲染不了
当前缀不一样业一样找不到渲染不了'''
2.列表
''' 因为如果一个django项目需要多个静态文件那么所有的静态文件的路径就都放到在个列表中 然后多个静态文件的前缀要跟上面的接口前缀一样'''
# 7.接口前缀绑定
''' 如果有时候我们需要修改配置文件的接口前缀 那么我们就需要把页面上的前缀给修改了 但是如果页面上有很多个路径的前缀都需要修改 那么这个时候就会很麻烦 那么这个时候django就帮我们设定了一个语法'''
# 这个时候我们只需要在页面上这么写即可:
{% load static %}
<link rel="stylesheet" href="{% static 'bootstrap-3.4.1-dist/css/bootstrap.min.css' %}">
# 这个时候不过配置文件的接口前缀不管怎么改都可以访问的到
二、请求方式
'''url:请求资源定位符(网址)'''
# 1.在form表单中有两种请求方式
# 1.GET请求
'''朝服务端索要数据
可以在网址后面携带一些数据 用?隔开
eg:url?xxx=yyy&zzz=ooo&aaa=bbb
上述携带数据有两种限制
1.携带的数据不能是敏感数据
2.携带的数据的大小有限制2kb~4kb
GET请求没有请求体'''
# 2.POST请求
'''朝服务端提交数据
也可以携带数据
数据都是放在请求体中 数据大小没有限制'''
# 2.form表单默认是GET请求
可以通过method属性修改请求方式
method = "post"
action # 控制数据的提交地址
方式1:不写 朝当前网页地址提交
方式2:写后缀 '/index/' 自动补全IP:PORT
方式3:写全称 https://baidu.com/
# 3.提交psot请求页面会报错 403
前期我们只要去配置文件中注释一句代码即可
MIDDLEWARE = [
# 'django.middleware.csrf.CsrfViewMiddleware',
]
三、request对象方法
# 当页面上有两个input框需要输入姓名和密码
<form action="" method="post">
<input type="text" name="username">
<input type="text" name="password">
<input type="submit" value="提交">
</form>
# 1.后端获取form表单发出的两个请求方式
request.method # 获取请求方式 结果是大写的字符串
# 获取POST请求提交的普通数据
request.POST # 获取POST请求发送过来的普通数据(不包含文件数据)
# request.POST 获取的数据可以当做是一个字典<QueryDict: {'username': ['jason'], 'password': ['123']}>
request.POST.get('username') # 默认获取列表中最后一个值
request.POST.getlist('username') # 获取键对应的整个列表 不过有几个值
# 获取url后面携带的非敏感数据GET请求
request.GET # 结果是一个QueryDict 也可以看成是字典处理
request.GET.getlist() # 获取键对应的整个列表 不过值有多少个
request.GET.get() # 默认获取列表最后一个值
'''由于GET请求更加常见 POST请求次之 所以还可以按照下列方式简写'''
if request.method == 'POST':
return HttpResponse('加油')
'''默认让试图函数处理GET请求'''
return render(request, 'login.html') # 因为GET请求也相当于返回一个页面
四、pycharm链接MySQL
'''其实pycharm也可以充当许多数据库的客户端'''
# 首先要找到页面上的database
页面右侧边栏有
最左下角正方形点开也有
# 如果两个地方都没有那么需要下载database插件如果插件
settings >>> plugins 搜索database 下载即可
# 如果下载插件还没有 那么就重装pycharm
# 首次链接数据库需要下载驱动
Download missing driver files
# 下载好之后点击Test Connection测试是否能够链接上
# 测试链接如果不通过 则需要换驱动重新下载即可
Driver MySQL MySQL fro 5.1


五、django链接MySQL
# django默认使用的是sqlite3 但是这款数据库一般只用于本地测试 功能较少
# 1.配置文件中修改配置
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql', # 指定数据库软件名称
'NAME': 'day55', # 指定库名
'USER': 'root',
'PASSWORD': '', # 填写密码
'HOST': '127.0.0.1',
'PORT': 3306,
'CHARSET': 'utf8'
}
}
#2.指定链接MySQL的模块
'''django1.11 版本需要在项目或者应用目录下的__init__.py中编写一行代码
import pymysql
pymysql.install_as_MySQLdb()
django2.2 以上版本需要使用mysqlclient模块'''
六、orm简介
# ORM:对象映射关系
# 就是通过python代码映射成SQL语句
python MySQL
类 映射成 表
对象 映射成 记录
对象点属性 映射成 字段对应的值
"""
ORM的存在可以让不会MySQL的python程序员 使用python的语法简单快捷的操作MySQL
"""
好处:提升了开发效率
坏处:封装了SQL语句 有时候可能效率不高 还需要认为编写SQL调优
七、ORM基本操作
# 1.我们首先要去应用下的models.py文件下创建模型类
class User(models.Model): # 类似于定义了表名
# id int primary key auto_increment
id = models.AutoField(primary_key=True) # 类似于定义了主键
# name varchar(32)
name = models.CharField(max_length=32) # 类似于定义了普通字段
# pwd int
pwd = models.IntegerField() # 类似于定义了普通字段
# 2.数据库的迁移命令
这个时候数据库还是没有这个表的我们要编写两行命令才行:
python3 manage.py makemigrations
# 将models中的有个数据库的操作记录下来存到migrations文件夹
python3 manage.py migrate
# 将创建的表迁徙到数据库中
ps:可以简写 也可以指定应用单独迁移/同步
# 3.表名的特征
Users app01_users
由于django支持多个应用 为了区分不同应用下可能会出现相同的表名
所以自动加上了应用的前缀 因为同一个应用下不可能出现相同的表名(只要是正常的程序员都不会犯这种错误)
# 4.表的主键在orm中 可以不写 orm会自动帮你添加一个id的主键
如果你需要主键的名称不叫id 只能自己创建
# 5.每次修改了跟数据库相关的python代码 都需要重新执行迁移命令
# 6.在pycharm迁移命令还可以简便操作
在tools中点击 run mange.py task
就可以在pycharm弹出的终端编写迁移命令
可以不用填写前缀直接写关键字:
makemigrations
migrate
八、ORM语法
# 查
res = models.User.objects.filter(name='jason')
print(res) # <QuerySet [<Users: Users object>]> 可以看成是一个列表套数据对象
print(res[0]) # Users object
print(res[0].name) # jason
# 如果没有索引值会直接报错 所以推荐使用first()
res = models.User.objects.filter(name='jason').first()
print(res.name) # jason
# 增
user_obj = models.Users.objects.create(name='jack',pwd='111')
# 主键可以不用写
# 改
models.User.objects.filter().update(name='jasonNB')
# 如果filter里面不写条件 会直接修改全部
models.User.objects.filter(id=1).update(name='jasonNB')
# 写条件就只会修改 id等于1的字段
# 删
models.User.objects.filter().delete()
# filter不写条件直接删全部
models.User.objects.filter(id=4).delete()
# 写了条件就只会删除id等于4的字段
九、外键字段
'''
MySQL
一对多
外键字段建在多的一方
多对多
外键字段建在第三张关系表
一对一
外键字段建在查询频率较高的表中'''
ORM:
一对多
外键字段也是健在多的一方 在多的一方的类中写下面的代码:
publish = models.ForeignKey(to='Publish',on_delete=models.CASCADE)
# publish:字段名 ForeignKey:一对一关键字 to后面写关联的表名 on_delete:级联删除(django1x中可以不写)
多对多
外键字段直接写在某张表中 orm会帮我们自动创建第三张表
authors = models.ManyToManyField(to='Authors')
# authors:字段名 ManyToManyField:多对多关键字 to后面写关联的表名 多对多不用写级联删除
一对一
外键字段建在查询频率高的表
detail = models.OneToOneField(to='AuthorDetail',on_delete=models.CASCADE)
# detail:字段名 OneToOneField:一对一关键字 to后面写关联的表名 on_delete:级联删除(django1x中可以不写)
十、作业
1. 路由层(urls.py)
urlpatterns = [
url(r'^admin/', admin.site.urls),
# home界面 数据展示
url(r'^home/', views.home),
# 增加数据
url(r'^add/', views.add),
# 修改数据
url(r'^update/', views.update),
# 删除数据
url(r'^delete/', views.delete)
]
2.视图层(views.py)
def home(request):
user_obj = models.User.objects.filter()
return render(request, 'home.html', {'user_obj': user_obj}) # 将用户信息传到前端
def add(request):
# 1.判断请求格式
if request.method == 'POST':
# 2.获取用户输入的信息
username = request.POST.get('username')
password = request.POST.get('password')
age = request.POST.get('age')
# 3.判断用户是否存在
is_user = models.User.objects.filter(name=username)
if is_user:
return HttpResponse('用户已存在')
# 4.添加用户
models.User.objects.create(name=username, pwd=password, age=age)
# 5.重定向到主页面
return redirect('/home/')
return render(request, 'add.html')
def update(request):
# 4.拿到网址后面的用户id号
update_id = request.GET.get('aaa')
# 1.判断请求格式
if request.method == 'POST':
# 2.获取用户输入信息
username = request.POST.get('username')
password = request.POST.get('password')
age = request.POST.get('age')
# 5.把修改的值 添加回去
models.User.objects.filter(id=update_id).update(name=username, pwd=password, age=age)
# 6.重定向到主页面
return redirect('/home/')
# 3.获取用户信息
user_obj = models.User.objects.filter(id=update_id).first()
return render(request, 'update.html', {'user_obj': user_obj}) # 将用户信息传到前端
def delete(request):
# 1.获取网址后面的用户id
delete_id = request.GET.get('aaa')
# 2.根据id删除
models.User.objects.filter(id=delete_id).delete()
return redirect('/home/')
3.home.html
<div class="container">
<div class="row">
<h1 class="text-center">数据展示</h1>
<div class="col-md-8 col-md-offset-2">
<table class="table table-hover table-striped">
<thead>
<tr>
<th>id</th>
<th>姓名</th>
<th>年龄</th>
<th>密码</th>
<th class="text-center">操作</th>
</tr>
</thead>
<tbody>
{% for user in user_obj %} {# 根据后端传的值循环 #}
<tr>
<td>{{ user.id }}</td>
<td>{{ user.name }}</td>
<td>{{ user.pwd }}</td>
<td>{{ user.age }}</td>
<td class="text-center">
<a href="/update/?aaa={{ user.id }}" class="btn btn-success btn-xs" >编辑</a>
<a href="/delete/?aaa={{ user.id }}" class="btn btn-danger btn-xs" >删除</a>
{# 根据网址?后面不会匹配特性 后面的id通过网址携带到后端 #}
</td>
</tr>
{% endfor %}
</tbody>
</table>
<a href="/add/" class="btn btn-primary btn-xs pull-right" >新增数据</a>
</div>
</div>
</div>
4.add.html
<div class="container">
<div class="row">
<h1 class="text-center">新增数据</h1>
<form action="" method="post">
<p>username: <input type="text" name="username" class="form-control"></p>
<p>password: <input type="text" name="password" class="form-control"></p>
<p>age: <input type="text" name="age" class="form-control"></p>
<input type="submit" class="btn btn-success btn-block">
</form>
</div>
</div>
5.update.html
<div class="container">
<div class="row">
<h1 class="text-center">修改数据</h1>
<form action="" method="post">
<p>username: <input type="text" name="username" class="form-control" value="{{ user_obj.name }}"></p>
<p>password: <input type="text" name="password" class="form-control" value="{{ user_obj.pwd }}"></p>
<p>age: <input type="text" name="age" class="form-control" value="{{ user_obj.age }}"></p>
<input type="submit" class="btn btn-success btn-block">
</form>
</div>
</div>