2.url控制器

1.path

1.普通分组

from django.urls import path,re_path
from app01 import views
urlpatterns = [
   path('admin/', admin.site.urls),
   path("my_url_controller/", views.my_url_controller),
]

注意

  1. 路由规则前面不需要添加一个前导的反斜杠
  2. 填写路由规则时需要注意规则是否以反斜杠结尾

2.有名分组(path转换器)

1.基础path转换器
名称
str匹配除了路径分隔符(/)之外的非空字符串,这是默认的形式
int匹配正整数,包含 0。
slug匹配字母、数字以及横杠、下划线组成的字符串
uuid匹配格式化的 uuid,如 075194d3-6885-417e-a8a8-6c931e272f00
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),  
]  

注意:

1.如果尖括号 (<>) 中没有指定任何基础path转换器,将匹配任何字符串,也包括了 / 字符

2.自定义path转化器

对于一些复杂或者复用的需要,可以定义自己的转化器.转化器是一个类或接口,它的要求有三点:

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

在app目录下新建customiz_path_converter.py

class CusPatCon:

    regex = r"[0-9]{4}"

    def to_python(self, value):
        return int(value)

    def to_url(self, value):
        return "40d%s" % value

urls.py:

from django.urls import path, register_converter

from my_url_controller import views, customiz_path_converter
#使用register_converter将其注册到 URL 配置中
register_converter(converter=customiz_path_converter.CusPatCon, type_name="yyy")

app_name = "my_url_controller1"
urlpatterns = [
    path("customiz_path_converter/<yyy:year>/<yyy:month>/<yyy:day>", views.my_url_controller_demo2)
]

views.py

# re_path:有名分组 /my_url_controller/2003/03/1
def my_url_controller_demo2(request, year, month, day):
    return HttpResponse("re_path:有名分组 year=%s:month=%s:day=%s" % (year, month, day))

2.re_path

1.普通分组

from django.urls import path,re_path
from app01 import views
urlpatterns = [
   re_path("^my_url_controller/([0-9]{4})/([0-9]{2})/$", views.my_url_controller_demo1),
   ,
]

2.有名分组

from django.urls import path,re_path
from app01 import views
urlpatterns = [
   # re_path:有名分组
   re_path("^my_url_controller/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/(?P<day>[0-9]+)/$", views.my_url_controller_demo2),
]

注意:

1.re_path分组匹配到的数据都是字符型,如果需要其他类型,建议使用path和path转换器

2.使用re_path的多个路由规则,如果相互之间相同的分组情况,为了方便修改,建议使用path和path转换器

2 include

from django.contrib import admin
from django.urls import path, re_path, include

from my_url_controller import views

urlpatterns = [
   # include:分发
   re_path("^my_url_controller/", include("my_url_controller.urls"))
]

3 名称空间

目的:使用名称空间进行反向解析

项目的urls.py

urlpatterns = [
path("my_url_controller/",include("my_url_controller.urls",namespace="my_url_controller")),
path("my_url_controller1/",include("my_url_controller.urls",namespace="my_url_controller1")),
]

app的urls

from django.urls import path
from my_url_controller import views
#重点
app_name = "my_url_controller1"
urlpatterns = [
    path("reserve/", views.my_url_controller_reverse,name='reverse' )
]

注意

1.app的urls中一定要指明app_name = “app的名称”

2.或者在项目中urls.py中指定include((“app名称:urls”,“app名称”),namespace=“空间名称”)

4.反向解析

目地:

对嵌入到生成的内容中(如视图中和显示给用户的 URL 等)或者用于处理服务器端的导航(重定向等)这些 URL,能够轻松的可扩展的改变这些url

1.视图中:

app中的views.py

# my_url_controller/reserve/
def my_url_controller_reverse(request):
    return HttpResponse(reverse("my_url_controller:reverse") + "\n"+reverse("my_url_controller1:reverse"))

2.模板中:

项目中urls.py

from django.urls import path,  include

urlpatterns = [
    path("my_url_controller2/", include("my_url_controller2.urls", namespace="my_url_controller2"))
]

app中urls.py:

from django.urls import  re_path

from my_url_controller2 import views

app_name = 'my_url_controller2'
urlpatterns = [
re_path("(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/(?P<day>[0-9]+)/$",views.my_url_controller2_demo2,name="my_url_controller2_demo2")
]

app中的views.py

def my_url_controller2_demo2(request, year, month, day):
  
    return render(request, "my_url_controller2_demo2.html")

模板中的my_url_controller2_demo2.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>my_url_controller2_demo2</title>
</head>
<body>
<a href="{% url 'my_url_controller2:my_url_controller2_demo2' year="2012" month="02" day="01" %}">2012 Archive</a>

</body>
</html>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值