Django 不同版本的区别--路由层与模板层

路由匹配的区别

Django 1.x 版本

from django.urls import url

urlpatterns = [
    url(r'^admin/', admin.site.urls),
]

Django 2.x 与 3.x 版本

from django.urls import path

urlpatterns = [
    path('admin/', admin.site.urls),
]

第一个参数不是正则,写的什么参数,就按照什么参数来匹配!

解决方法:导入一个新的模块re_path即可

from django.urls import re_path

urlpatterns = [
    re_path(r'^admin/', admin.site.urls),
]

转换器

Django 2.x 与 3.x 版本 path还支持转换器功能

针对路径http://127.0.0.1:8000/articles/2009/123/hello/,path会匹配出参数year=2009,month=123,other='hello’传递给函数article_detail

urlpatterns = [
    path('articles/<int:year>/<int:month>/<slug:other>/', views.article_detail),
]

 

五种默认的转换器(相当于一个有名分组,自动帮你转换成指定类型的数据)

<str:xxx>: 默认的类型,匹配非空字符串,不包含路径分隔符/

<int:xxx>匹配非负整数

<slug:xxx>匹配字母、数字已经横杠-、下划线_ 组成的字符串

<uuid:xxx>:**匹配格式化的 UUID **

<path:xxx>匹配任何非空字符串,包含路径分隔符/,不能用?

针对月份month,转换器int是无法精准匹配的,如果我们只想匹配两个字符,那么转换器slug也无法满足需求,针对等等这一系列复杂的需要,我们可以定义自己的转化器。转化器是一个类或接口,它的要求有三点:

  • regex 类属性,字符串类型
  • to_python(self, value) 方法,value是由类属性 regex 所匹配到的字符串,返回具体的Python变量值,以供Django传递到对应的视图函数中。
  • to_url(self, value) 方法,和 to_python 相反,value是一个具体的Python变量值,返回其字符串,通常用于url反向引用。

自定义转换器示例:

  1. 在app01下新建文件path_ converters.py,文件名可以随意命名

    class MonthConverter:
        regex='\d{2}' # 属性名必须为regex
    
        def to_python(self, value):
            return int(value)
    
        def to_url(self, value):
            return value # 匹配的regex是两个数字,返回的结果也必须是两个数字
    
  2. 在urls.py中,使用register_converter 将其注册到URL配置中:

    from django.urls import path,register_converter
    from app01.path_converts import MonthConverter
    
    register_converter(MonthConverter,'mon')
    
    from app01 import views
    
    
    urlpatterns = [
        path('articles/<int:year>/<mon:month>/<slug:other>/', views.article_detail, name='aaa'),
    
    ]
    
  3. views.py中的视图函数article_detail

    from django.shortcuts import render,HttpResponse,reverse
    
    def article_detail(request,year,month,other):
        print(year,type(year))
        print(month,type(month))
        print(other,type(other))
        print(reverse('xxx',args=(1988,12,'hello'))) # 反向解析结果/articles/1988/12/hello/
        return HttpResponse('xxxx')
    
  4. 测试

    # 1、在浏览器输入http://127.0.0.1:8000/articles/2009/12/hello/,path会成功匹配出参数year=2009,month=12,other='hello'传递给函数article_detail
    # 2、在浏览器输入http://127.0.0.1:8000/articles/2009/123/hello/,path会匹配失败,因为我们自定义的转换器mon只匹配两位数字,而对应位置的123超过了2位
    

# 模型层的区别

models.py中创建外键,会有区别

Django 1.x 版本 :创建外键默认就是级联更新,级联删除

Django 2.x 与 3.x 版本:需要自己指定 字段

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值