03 编写URL规则

3-1 URL编写规则
# 在每个App中设置独立的静态资源和模板文件并添加一个空白内容的urls.py文件。
# 当程序收到用户请求的时候,首先在根目录的urls.py查找该URL属于哪个APP,然后再从APP的urls.py找到具体的URL信息。

# 在根目录的urls.py编写URL规则,如下所示:
from django.contrib import admin      # 导入Admin功能模块
from django.urls import path,include  # 导入URL编写模块
# 项目的URL集合,每个元素代表一条URL信息 
urlpatterns = [
    # admin.site.urls是URL的处理函数,也称为视图函数
    path('admin/', admin.site.urls),  # Admin站点管理
    # URL为空,代表为网站的域名,即127.0.0.1:8000,include将该URL的urls.py处理
    path('',include('index.urls'))    # 首页地址
]

# 由于首页的地址分发给index的urls.py处理,因此下一步需要对index的urls.py编写URL信息
from django.urls import path
from . import views
urlpatterns=[
    path('',views.index)
]

# 上述代码导入了同一目录下的views.py文件,该文件用于编写视图函数,处理URL请求信息并返回网页内容给用户。
# index函数必须设置参数request,该参数代表当前用户的请求对象,该对象包含用户名,请求内容和请求方式等信息
from django.shortcuts import HttpResponse
def index(request):
    return HttpResponse("Hello World")

3-2 带变量的URL
# URL的变量类型由字符类型、整型、slug和uuid,最为常用的是字符类型和整型
    # 字符类型:匹配任何非空字符串,但不含斜杠。如果没有指定类型,默认使用该类型
    # 匹配0和正整数
    # 可理解为注释、后缀或附属等概念
    # 匹配一个uuid格式的对象
# 根据上述变量类型,在index的urls里面添加带有字符类型、整型和slug的urls地址信息,代码如下:
from django.urls import path
from . import views
urlpatterns=[
    path('',views.index),
    # <year>:变量名为year,数据格式为字符类型,与<str:year>的含义一样
    path('<year>/<int:month>/<slug:day>',views.mydate)
]
然后在views.py中编写视图函数mydate的处理方法,带么如下:
def mydate(request,year,month,day):
    return HttpResponse(str(year)+'/'+str(month)+'/'+str(day))
# 在URL中引入正则表达式,首先导入re_path功能模块,正则表达式的作用是对URL的变量进行截取和判断
from django.urls import path,re_path
urlpatterns=[
    # path('<year>/<int:month>/<slug:day>',views.mydate),
    # ?P是固定格式,<year>为变量的编写规则,[0-9]{4}代表变量的长度为4,只允许截取0-9的值
    # re_path('(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/(?P<day>[0-9]{2})',views.mydate)
]

3-3 设置参数name
# 在urls.py添加新的视图函数
re_path('(?P<year>[0-9]{4})',views.myyear,name='myyear')
#在templates文件夹添加myyear.html文件<body></body>中添加:
<body>
    <div><a href="/2018.html">2018 old Archive</a></div>
    <div><a href="{% url 'myyear' 2018 %}">2018 Archive</a></div>
</body>
#在view.py添加对应的视图函数:
from django.shortcuts import HttpResponse,render
def myyear(request,year):
    return render(request,'myyear.html')
# 上述代码分别从URL、视图函数和HTML模板来说明name的具体作用:
    # (1) 当用户访问该URL时,项目根据URL信息选择视图函数myyear处理,并将该URL命名为myyear.
    # (2) 视图函数myyear将模板myyear.html作为响应内容生成相应的网页返回给用户.
    # (3) 在模板myyear.html中设置两个标签a,虽然两个标签a的href属性值的写法有所不同,但实质上两者都指向命名为myyear的URL信息
    # (4) 第二个标签a的href为{% url 'myyear' 2018 %},这是Django的模板写法,模板语法以{%%}表示。
          # 其中,url'myyear'是将命名为myyear的URL的地址信息作为href属性值;2018是该URL的变量year,若URL没有设置变量值,则无须添加
          # 在URL中设置参数name,只要参数name的值不变,无论URL地址信息如何修改都无须修改模板中标签a的href属性值
          
3-4 设置额外参数
# 参数为字典的URL
re_path('(?P<year>[0-9]{4})',views.myyear_dict,{'month':'05'},name='myyear_dict')
# 参数为字典的URL的视图函数
def myyear_dict(request,year,month):
    return render(request,'myyear_dict.html',{'month':month})
# 在template文件夹添加myyear_dict.html文件:
<body>
    <a href="{% url 'myyear_dict' 2018%}">2018{{ month }} Archive</a>
</body>
# 在编写URL规则时,如果需要设置额外参数,设置规则如下:
    # 参数只能以字典的形式表示
    # 设置的参数只能视图函数读取和使用
    # 字典的一个键值对代表一个参数,键代表参数名,值代表参数值
    # 参数值没有数据格式限制,可以为某个对象。字符串或列表(元祖)等

猜你喜欢

转载自www.cnblogs.com/larken/p/10554674.html
03