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]img

  • 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


无名分组

有名分组

posted @ 2020-05-27 09:19  黑猫警长紧张  阅读(153)  评论(0编辑  收藏  举报