4.django版本区别
- 路由的区别
- django1.X版使用的是url函数
- django2.0版的re_path与path
- 其中url和re_path的用法一样
urlpatterns = [
# 用法完全一致
url(r'^app01/', include(('app01.urls','app01'))),
re_path(r'^app02/', include(('app02.urls','app02'))),
]
- path中第一个是绝对的路径不是正则表达式
- 如果2.X版本中要使用url函数也是可以的,但不推荐使用
from django.conf.urls import url # 在django2.0中同样可以导入1.0中的ur
urlpatterns = [
# 用法完全一致
url(r'^app01/', include(('app01.urls','app01'))),
re_path(r'^app02/', include(('app02.urls','app02'))),
]
- 如何用path完成有名和无名分组
django默认支持一下5种转换器(Path converters)
str,匹配除了路径分隔符(/)之外的非空字符串,这是默认的形式
int,匹配正整数,包含0。
slug,匹配字母、数字以及横杠、下划线组成的字符串。
uuid,匹配格式化的uuid,如 075194d3-6885-417e-a8a8-6c931e272f00。
path,匹配任何非空字符串,包含了路径分隔符(/)(不能用?)
urlpatterns = [
# 问题一的解决方案:
path('articles/<int:year>/', views.year_archive),
# <int:year>相当于一个有名分组,其中int是django提供的转换器,相当于正则表达式,专门用于匹配数字类型,而year则是我们为有名分组命的名,并且int会将匹配成功的结果转换成整型后按照格式(year=整型值)传给函数year_archive
# 问题二解决方法:用一个int转换器可以替代多处正则表达式
path('articles/<int:article_id>/detail/', views.detail_view),
path('articles/<int:article_id>/edit/', views.edit_view),
path('articles/<int:article_id>/delete/', views.delete_view),
]
- 使用尖括号(<>)从url中捕获值,相当于有名分组
-<>中可以包含一个转化器类型(converter type),比如使用 <int:name> 使用了转换器int。若果没有转化器,将匹配任何字符串,当然也包括了 / 字符
- 转换器可以自定义
- 模型层里的外键1.X都是默认级联更新,2.x需要手动配置
name = models.ForeignKey(to='XX', on_delete=models.CASCADE)
# on_delete=models.CASCADE就是级联更新