day63
一.昨日回顾二.django2.0版的path三.path转化器三.自定义转换器(不重要)四.图书管理系统表关系(图书管理系统)五.补充
一.昨日回顾
1 django orm 连接mysql
-1 安装pymysql
-2 setting中配置
-3 django默认用过的mysqldb
,在app的__init__
.py中写两句话
-4 后续操作完全一样
2 pycharm链接mysql
,sqlite
3 路由的基本使用
-1.x中 url函数
,四个参数
4 路由分发
-不同app有自己的路由关系
-127.0.0.1/app01
/login
-根路由
url('app01',include('app01.url'))
5 无名分组
-127.0.0.1/login
/4444/55666 4444和
55666会当做位置参数传递给视图函数
-url(r
'^login/(\d+)/(\d+)',include('app01.url'))
6 有名分组
-url(r
'^login/(?P<year>\d+)/()',include('app01.url'))
-跟无名分组不能混用
7 反向解析
-动态获取路由
-视图函数
-url
=reverse('路由别名')
-模板文件
-{% url
'路由别名' %}
8 名称空间
-name重名了
,不知道反向解析找的是哪一个
,在include路由发布时
,给每个路由加一个名称空间
-url
=reverse('名称空间:路由别名')
--{% url
'名称空间:路由别名' %}
二.django2.0版的path
1 从
2.x以后
,建议使用path
,是一个准确路径
2 使用正则方式
,推荐使用re_path
,用法跟url一模一样
django2.0的re_path和1.0的url一样
思考情况如下:
urlpatterns
= [
re_path('articles/(?P<year>[0-9]{4})/', year_archive
),
re_path('article/(?P<article_id>[a-zA-Z0-9]+)/detail/', detail_view
),
re_path('articles/(?P<article_id>[a-zA-Z0-9]+)/edit/', edit_view
),
re_path('articles/(?P<article_id>[a-zA-Z0-9]+)/delete/', delete_view
),
]
考虑下这样的两个问题:
第一个问题,函数 year_archive 中year参数是字符串类型的,因此需要先转化为整数类型的变量值,当然year=int(year) 不会有诸如如TypeError或者ValueError的异常。那么有没有一种方法,在url中,使得这一转化步骤可以由Django自动完成?
第二个问题,三个路由中article_id都是同样的正则表达式,但是你需要写三遍,当之后article_id规则改变后,需要同时修改三处代码,那么有没有一种方法,只需修改一处即可?
在Django2.0中,可以使用 path 解决以上的两个问题。 基本示例 这是一个简单的例子:
from django
.urls
import path
from . import views
urlpatterns
= [
path
('articles/2003/', views
.special_case_2003
),
path
('articles/<int:year>/', views
.year_archive
),
path
('articles/<int:year>/<int:month>/', views
.month_archive
),
path
('articles/<int:year>/<int:month>/<slug>/', views
.article_detail
),
path
('order/<int:year>',views
.order
),
]
基本规则:
使用尖括号(<>)从url中捕获值。 捕获值中可以包含一个转化器类型(converter type),比如使用 int:name捕获一个整数变量。若果没有转化器,将匹配任何字符串,当然也包括了 / 字符。无需添加前导斜杠。
三.path转化器
1 5个内置转换器
'''
str
,匹配除了路径分割符(/)之外的非空字符串
,这是默认的形式
int
,匹配正整数
,包含
0.
slug
,匹配字母
,数字以及横杠
,下划线组成的字符串
uuid
,匹配格式化的uuid
,如
075194d3
-6885-417e
-a8a8
-6c931e272f00(唯一标识
)。
path
,匹配任何非空字符串
,包含了路径分隔符(/)(不能用
?)
'''
2 例子
-path('login/<int:year>',views
.login
),
-path('login/<str:year>',views
.login
),
-path('login/<path:p>',views
.article
),
3 高级例子
-实现匹配这种路径
:http
://127.0.0.1:8000/liuqingzheng
/p
/4444.html
-path('<str:name>/p/<int:id>.html',views
.article
),
-re_path(r
'^(?P<name>.*?)/p/(?P<id>/d+).html$',views
.login
),
-url(r
'^(?P<name>.*?)/p/(?P<id>\d+).html$',views
.login
), # url在
2.x以后不建议使用
4 转换器可以不可以在re_path中使用
? 不能
!!!
三.自定义转换器(不重要)
1 写一个类
-regex属性
:这里写的正则表达式就能匹配
-to_python方法
-to_url方法
2 注册这个类
register_converter(类名
,'lqz')
3 使用在path中更实用
path('<lqz:name>/',views
.article
),
四.图书管理系统表关系(图书管理系统)
0 表中字段的关系
-一对一
-一对多
-多对多
1 需要有哪几个表
-书籍表
:book
-id
-name
-price
-publish
-作者
:author
-id
-name
-age
-author_detail_id
1
-作者详情
:authordetail
-id
-address
-phone
#
-author_id
-出版社
:publish
-id
-name
-addr
-email
2 表之间的关系
-书和作者
:多对多
:需要创建第三张表(中间表
,关系表
)
-书和出版社
:一对多
:一对多的关系一旦确立
,关联字段写在多的一方
-作者和作者详情
:一对一
,关联字段写在谁都可以
,推荐写在查询多的一方
3 其实 一对一的关系
,是一对多
+unique(理解这句话
)
五.补充
partial是什么
,怎么用
,有什么用
?
短链生成
:https
://www
.layui
.com
/demo
/carousel
.html https
:/a
.com
/asfdasd