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规则时,如果需要设置额外参数,设置规则如下: # 参数只能以字典的形式表示 # 设置的参数只能视图函数读取和使用 # 字典的一个键值对代表一个参数,键代表参数名,值代表参数值 # 参数值没有数据格式限制,可以为某个对象。字符串或列表(元祖)等