Django框架学习 5.26 待补充
5.26
昨日回顾
静态文件配置
- 浏览器窗口输入url之所以能访问到对应的资源源,是因为后端提前开放了该资源的访问接口
- 约定俗成把html文件放在templates文件夹下
- 静态文件:
网站已经写好的,或者是第三方现成的代码,直接使用,放在static文件夹下
css,js,img,框架
- static文件夹内还会创建几个文件夹:css,js,img,第三方
静态文件配置:settings.py
STATUC_URLS = '/static' # 访问静态文件的令牌
STATICFILES_DIRS = [
os.path.join(BASE_DIR,'static'),
os.path.join(BASE_DIR,'static1'),
]
查找顺序是从上往下依次查找
令牌动态解析
<link href="/static/a.txt"></link>
{% load static %}
<link href="{% static 'a.txt'%}"></link>
request对象方法
以登陆功能为例
request.method # 全大写的字符串格式,获取当前的请求方式,GET,POST
request.GET # 获取url的?后面携带的参数
request.POST # 获取post请求提交过来的普通键值对
request.POST.get() # 得到列表的最后一个元素
request.POST.getlist() # 得到整个列表
前期再往django提交post请求的时候先去配置文件中注释一行代码
MIDDLEWARE = {}
pycharm连接数据库
连接pycharm数据库
下载对应的驱动
django连接MySql
配置文件配置 settings.py
django不能配置库,需要自己创建
# 1.
DATABASES = {
'default':{
'ENGINE':'django.db.backends.mysql',
'NAME':'db1',
'USER':'root',
'PASSWORD':'6008',
'HOST':'127.0.0.1',
'PORT':3306,
'CHARSET':'utf8'
}
}
# 2. init文件指定pymysql
import pymysql
pymysql.install_as_MySQLdb()
django ORM 重要
能够让一个不会sql语句的python程序员也能够更简单的操作数据库,极大地提升开发效率
去应用下的models.py中书写模型类
class Userinfo(models.Model):
uid = models.AutoField(primary_key=Ture)
# 如果没有创建主键,orm会自动帮你创建一个名为id的主键字段
# uid int primary key auto_increment
username = models.CharField(max_length=32)
# 默认是varchar,一定要指定max_length
password = models.IntegarField()
数据库迁移命令
python3 manage.py makemigrations
# 将操作记录到migration文件夹内,不是真正的从左数据库
python3 manage.py migrate
# 将操作真正同步到数据库中
# 只要在models中书写了数据库相关代码,必须要重新执行上面两行代码
# pycharm可以快速提示
简单的orm语句
# 字段的增删改查
# 增
1. 终端里自己加默认值
2. null = True
3. default = '666'
# 删
注释代码,两条命令
# 改
增改代码执行两条命令
# 数据的增查
# 增
from app01 import models
# create()
user_obj = models.UsrInfo.objects.create(**kwargs)
# save()
user_obj = models.User(**kwargs)
user_obj.save()
# 查
# filter()
user_obj_list = models.UserInfo.objects.filter(**kwargs)
user_obj = user_obj_list[0]
user_obj = user_obj_list.first() # 推荐
今日内容
- 数据的查,改,删
- django orm中如何创建表关系
- django请求生命周期流程图
- 详细讲django每一个部分详细的内容
- 路由层:urls.py
OPM操作数据
查找数据
# views.py
def userlist(request):
# 方式1
data = models.User.object.filter()
print(data)
# 方式2
user_queryset = models.User.object.all()
# 给html传值方式1
return render(request,'userlist.html',{'user_queryset':'user_queryset'})
# 传值方式2
return render(request,'userlist.html',local())
html中展示数据
{{ user_obj.id }}
{{ user_obj.username }}
编辑数据功能
点击编辑按钮后,朝后端发送编辑数据请求,将编辑按钮所在的那一行数据的主键发送给后端
在a标签的href后面加上id
<a href="/edit_user/?user_id={{user_obj.id}}"></a>
def edit_user(request):
# 在后端获取url 问号后面的参数
edit_id = request.GET.get('user_id')
# 查询当前用户想要编辑的数据对象
edit_obj = models.User.objects.filter(id=edit_id).first()
# 将数据展示到页面上
return render()
修改数据
# 修改方式1
models.User.object.filter(id=edit_id).update(username=username,password=password)
# 这个方法只修改filter中选中的数据
# 修改方式2
edit_obj.username = username
edit_obj.password = password
edit_obj.save()
# 这个方法会将所有的字段,无论改没改,都重写一遍
删除数据
.delete()
在html的href中加id,告诉后端要删除哪个用户
# views.py
def delete_user(request):
delete_id = request.GET.get('user_id')
# 直接去数据库中找到对应的数据删除即可
models.User.objects.filter(id=delete_id).delete()
return redirect('/userlist/')
# 删除完了,转到展示信息界面
删除数据内部并不是真正的删除,知识给数据添加一个标识字段,标识当前数据是否被删除的,仅仅只是将字段修改一个状态
orm创建表关系
表关系:一对多,一对一,多对多
例子:图书,作者,出版社
- 图书和出版社是一对多的关系,外键字段键在多的一方:book
- 图书和作者是多对多的关系,创建第三张表存储关系
- 作者与作者介绍是一对一关系
# models.py 先建表
class Book(models.Model):
title = models.CharField(max_length=32)
price = models.DecimalField(max_digit=8,decimal_places=2)
# 图书和出版社是多对一,外键放在书里
publish = models.ForeignKey(to='Publish')
# 默认把出版社表的主键拿来做外键
# 图书和作者是多对多关系 外键字段建在任意一方均可,但是推荐建在查询频率高的一方
authors = model.ManyToManyField(to='Author')
# authors是一个虚拟字段,主要告诉orm,书籍表和作者表是多对多关系
class Publish(models.Model):
name = models.CharField(max_length=32)
addr = models.CharField(max_length=32)
class Author(models.Model):
name = models.CharField(max_length=32)
age = models.IntegerFields()
# 与作者信息是一对关系,外键建在查询频率高的表
author_detail = models.OneToOneField(to='AuthorDetail')
class AuthorDetail(models.Model):
phone = models.BigIntegerField()
addr = models.CharField(max_length=32)
配置数据库,修改DATABASES
创建表后执行两条命令,去navicat中查看字段,orm会自动在外键字段的后面加_id,publish_id
总结
三种关系:
ManyToManyField()
OneToOneField()
ForeignKey() # 多对一
在django1.x版本,外键默认都是级联更新的,2.x,3.x不是
django请求生命周期流程图
重要,必会
浏览器 - wsgi - 中间件 - 路由系统 - 视图函数 - [orm-数据库, template]
- WSGI和wsgiref和uwsgi是什么关系:
- WSGI是协议
- wsgiref和uwsgi是实现改协议得到功能模块
路由层
路由匹配
# urls.py
urlpatterns = [
url(r'^admin/',admin.site.urls),
#url(r'^test',views.test),
#url(r'^teatadd',views.testadd)
]
# url方法第一个参数会拿去正则匹配,只要匹配到,就立马执行后面的内容
# 所以输入testadd,会匹配到test,到不了第三个url,所以只会执行test
# 在test后面加/
# 严格限制后缀名的结尾,否则后缀名之后无论写什么都会进入test,加上$
url(r'^test/$',views.test),
url(r'^teatadd/$',views.testadd)
# 如果url中的后缀没有加斜杠,第一次匹配不成功,django会帮你加上/,做重定向,再匹配一次
# 这个功能可以在配置文件里改
# settings.py
APPEND_SLASH = False
# 设置不加后缀名,就转向首页,正则匹配为空才转
url(r'^$',views.test)
# views.py
无名分组
有名分组