1、URL配置小技巧

# 旧版django
from django.conf.urls import url
from . import views


urlpatterns = [
    url(r'^reviews/2003/$', views.special_case_2003),
    url(r'^reviews/([0-9]{4})/$', views.year_archive),
    url(r'^reviews/([0-9]{4})/([0-9]{2})/$', views.month_archive),
    url(r'^reviews/([0-9]{4})/([0-9]{2})/([0-9]+)/$', views.review_detail),
]

# 新版django
from django.conf.urls import path, re_path
from . import views


urlpatterns = [
    re_path(r'^reviews/2003/$', views.special_case_2003),
    re_path(r'^reviews/([0-9]{4})/$', views.year_archive),
    re_path(r'^reviews/([0-9]{4})/([0-9]{2})/$', views.month_archive),
    re_path(r'^reviews/([0-9]{4})/([0-9]{2})/([0-9]+)/$', views.review_detail),


  • 若想捕获 URL 中的值,把值放在括号里
  • 无需使用前导斜线,每个 URL 本身就有。例如,是^reviews,而非^/reviews。
  • 每个正则表达式字符串前面的’r’ 是可选的,但是建议加上。它的作用是告诉 Python,那是“原始”字
    符串,里面的一切内容都不应该转义

对/reviews/2005/03/ 的请求匹配上述列表中的第三个条目。Django 调用views.month_archive(request,
‘2005’, ‘03’) 函数
/reviews/2005/3/ 不匹配任何 URL 模式,因为列表中的第三个条目要求月份有两个数字
/reviews/2003/ 匹配列表中的第一个模式,而不是第二个,因为模式按顺序测试,而第一个就能让测
试通过。你可以调整顺序,添加类似这样的特例

from django.conf.urls import re_path
from . import views

urlpatterns = [
    re_path(r'^reviews/2003/$', views.special_case_2003),
    re_path(r'^reviews/(?P<year>[0-9]{4})/$', views.year_archive),
    re_path(r'^reviews/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$',views.month_archive),
    re_path(r'^reviews/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/(?P<day>[0-9]{2})/$',views.review_detail),
]
  • 对/reviews/2005/03/ 的请求调用views.month_archive(request,year=‘2005’,month=‘03’)函数,而不是views.month_archive(request,‘2005’,‘03’)。
  • 对/reviews/2003/03/03/ 的请求调用views.review_detail(request,year=‘2003’,month=‘03’,day=‘03’) 函数。
 
# demo
from django.urls import path,include,re_path
from wood import views

urlpatterns = [
    <!--path('home/', views.home),-->
    <!--path('demo/', views.demo),-->
    <!--path('page/', views.bad_page),-->
    re_path(r'(?P<year>[0-9]{4})/$', views.year_today),
    re_path(r'(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$', views.month_today)
]

# >>> views.py
def year_today(request, year):
	return HttpResponse('The moment Year is %s' % year)

def month_today(request, year, month):
	return HttpResponse('The moment month is %s ,The Year is %s' % (month, year))

捕获的参数始终是字符串

不管正则表达式匹配的是什么类型,捕获的每个参数都以普通的 Python 字符串传给视图。对 URL 配置中的
这一行来说:

path(r'^reviews/(?P<year>[0-9]{4})/$', views.year_archive),

虽然[0-9]{4} 只匹配字符串中的整数,但是传给views.year_archive() 视图函数的year 参数是字符串,而不是整数。

为视图的参数指定默认值
# URL 配置
from django.conf.urls import url
from . import views

urlpatterns = [
    url(r'^reviews/$', views.page),
    url(r'^reviews/page(?P<num>[0-9]+)/$', views.page),
]
# 视图(在 reviews/views.py 文件中)
def page(request, num="1"):

在上述示例中,两个 URL 模式指向同一个视图,即views.page,但是第一个模式没有从 URL 中匹配任何内
容。如果匹配第一个模式,page() 函数使用num 的默认值,即"1";如果匹配第二个模式,page() 函数使用
正则表达式匹配的num 值

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值