DAY 46 django01
-
静态文件配置
# 1.静态文件
网站所使用的已经提前写好的文件
css文件
js文件
img文件
第三方文件
我们在存储静态文件资源的时候一般默认都是放在static文件夹下
# 2.django静态文件配置
settings.py
STATICFILES_DIRS = [
os.path.join(BASE_DIR,'static'),
os.path.join(BASE_DIR,'static1'),
os.path.join(BASE_DIR,'static2'),
]
# 3.接口前缀
STATIC_URL = '/static/'
# 4.动态匹配
{% load static %}
{% static 'a.txt' %} -
request对象方法
request.method # 获取请求方式
纯大写的字符串类型
request.POST # 获取post请求提交的普通数据
可以看成是一个字典
.get()
.getlist()
request.GET # 获取url问好后面携带的参数
可以看成是一个字典
.get()
.getlist()
request.body # 原始的二进制数据 -
pycharm如何链接数据库
1.DataBase
2.选择相应数据库
3.第一次连接一定要下载对应的驱动
可能存在多个驱动,挨个尝试即 -
django如何指定数据库
1.settings文件
DATABASES = {
'DEFAULT':{
}
}
2.项目文件夹或者应用文件夹下的__init__文件
import pymysql
pymysql.install_as_MySQLdb() -
django orm操作
"""
ORM 对象关系映射
类 表
对象 一条条记录
属性 字段对应的值
"""
能够让不会SQL的python程序员,通过面向对象的知识也能够简单快捷的操作数据库
# 1.models.py
class Userinfo(models.Model):
# 主键字段不指定则默认添加一个名为id的主键字段
username = models.CharField(max_length=32,verbose_name='用户名')
# 2.数据库迁移命令
python3 manage.py makemigrations
python3 manage.py migrate
'''往后只要在models.py中修改了跟模型表相关的代码就必须重新执行'''
# 3.CURD操作
字段
null=True
default=''
数据
models.Userinfo.objects.filter(**kwargs)
结果暂且可以看成是列表套数据对象
.first()
models.Userinfo.objects.all()
结果暂且可以看成是列表套数据对象
models.Userinfo.objects.create(**kwargs)
添加数据
models.Userinfo.objects.filter(**kwargs).update(**kwargs)
修改数据
models.Userinfo.objects.filter(**kwargs).delete()
删除数据
-
数据库同步命令(了解)
-
orm创建外键关系
-
django请求生命周期流程图
-
分块具体学习django所有的功能
路由层(urls.py)
-
路由匹配
-
无名有名分组
-
反向解析
-
路由分发
-
名称空间
数据库同步命令(了解)
"""
数据库里面已经有一些表,我们如何通过django orm操作?
1.照着数据库表字段自己在models.py
数据需要自己二次同步
2.django提供的反向同步
"""
1.先执行数据库迁移命令 完成链接
python manage.py makemigrations
2.查看代码
python manage.py inspectdb
class Userinfo(models.Model):
id = models.IntegerField(blank=True, null=True)
name = models.CharField(max_length=32, blank=True, null=True)
pwd = models.IntegerField(blank=True, null=True)
class Meta:
managed = False
db_table = 'userinfo'
orm创建外键关系
"""
1.表与表之间的关系
一对多
一对一
多对多
2.表关系的判断
换位思考
"""
书籍表
出版社表
作者表
# ORM针对外键字段的创建位置
一对多
推荐建在多的一方
一对一
建在任何一方都可以,但是推荐建在查询频率较高的表中
多对多
1.自己建表
2.建在任何一方都可以,但是推荐建在查询频率较高的表中
class Book(models.Model):
title = models.CharField(max_length=32)
price = models.DecimalField(max_digits=8,decimal_places=2) # 总共8位 小数占2位
# 出版社外键
publish = models.ForeignKey(to='Publish') # 默认就是主键
"""自动在外键字段后面加_id后缀"""
# 作者外键
authors = models.ManyToManyField(to='Author') # 自动帮你创建书籍和作者的第三张表
"""虚拟字段不会在表中实例化出来 而是告诉ORM创建第三张关系表"""
class Publish(models.Model):
title = models.CharField(max_length=32)
email = models.EmailField()
class Author(models.Model):
name = models.CharField(max_length=32)
age = models.IntegerField()
author_detail = models.OneToOneField(to='AuthorDetail')
"""自动在外键字段后面加_id后缀"""
class AuthorDetail(models.Model):
phone = models.BigIntegerField()
addr = models.CharField(max_length=128)
django请求生命周期流程图
参考群内截图
路由层之路由匹配
"""路由你可以看成就是出去ip和的port之后的地址"""
url()方法
1.第一个参数其实是一个正则表达式
2.一旦第一个参数匹配到了内容直接结束匹配 执行对应的视图函数
url(r'^test/$',views.test)
无名分组
url(r'^test/\d+/$',views.test)
# 正则表达式分组:给正则表达式前后加一个小括号
url(r'^test/(\d+)/$',views.test)
"""
无名分组
将括号内正则表达式匹配到的内容当做位置参数传递给后面的视图函数
"""
有名分组
url(r'^testadd/(?P<id>\d+)/$',views.testadd)
"""
有名分组
将括号内正则表达式匹配到的内容当做关键字参数传递给后面的视图函数
"""
是否可以结合使用
url(r'^test1/(\d+)/(?P<id>\d+)/$',views.test1)
1.无名有名分组不能混合使用
url(r'^test2/(\d+)/(\d+)/$',views.test2),
url(r'^test2/(?P<id>\d+)/(?P<id1>\d+)/$',views.test2)
2.可以单个重复使用
反向解析
当路由频繁变化的时候,html界面上的连接地址如何做到动态解析
# 1.给路由与视图函数对应关系添加一个别名(名字自己指定 只要不冲突即可)
url(r'^index/',views.index,name='index_name')
# 2.根据该别名动态解析出一个结果,该结果可以直接访问到对应的路由
前端
<a href="{% url 'index_name' %}">111</a>
后端
from django.shortcuts import reverse
reverse('index_name')
ps:redirect括号内也可以直接写别名
无名有名反向解析
url(r'^index/(\d+)/',views.index,name='index_name')
后端
reverse('index_name',args=(1,)) # 只要给个数字即可
前端
<a href="{% url 'index_name' 1 %}"></a> # 只要给个数字即可
url(r'^index/(?P<id>\d+)/',views.index,name='index_name')
后端
reverse('index_name',kwargs={'id':123}) # 只要给个数字即可
前端
<a href="{% url 'index_name' id=666 %}"></a> # 只要给个数字即可
总结
无名有名都可以使用一种(无名)反向解析的形式