url映射相关问题:
- 为什么去urls.py文件中寻找映射?
因为在settings.py
文件中配置了ROOT_URLCONF
为urls.py
。所有django会去urls.py
中寻找。 - 在
urls.py
中我们所有的映射,都应该放在urlpatterns
这个变量中。 - 所有的映射不是随便写的,而是使用
path
函数或者是re_path
函数进行包装的。
url传参:
- url中使用变量:在path的第一个参数中,使用
<参数名>
的方式可以传递参数。然后在视图函数中也要写一个参数,视图函数中的参数必须和url中的参数名称保持一致,不然就找不到这个参数。另外,url中可以传递多个参数。 - 采用查询字符串的方式:在url中,不需要单独的匹配查询字符串的部分。只要在视图函数中使用
request.GET.get('参数')
的方式来获取。
因为查询字符串使用的是def author_detail(request): author_id = request.GET['id'] text = '您当前查询的id是:%s' % author_id return HttpResponse(text)
GET
请求,所以我们通过request.GET
来获取参数。并且因为GET
是一个类似于字典的数据类型,所有获取值跟字典的方式都是一样的。
Django自带的url参数转换器:
str
:除了斜杠/
以外所有的字符都是可以的。int
:只有是一个或者多个的阿拉伯数字。path
:所有的字符都是满足的。uuid
:只有满足uuid.uuid4()
这个函数返回的字符串的格式。slug
:英文中的横杆或者英文字符或者阿拉伯数字或者下划线才满足。
指定url传参默认参数类型
使用path或者是re_path的后,在route中都可以包含参数,而有时候想指定默认的参数,这时候可以通过以下方式来完成。示例代码如下:
from django.urls import path
from . import views
urlpatterns = [
path('blog/', views.page),
path('blog/page<int:num>/', views.page),
]
当在访问blog/的时候,因为没有传递num参数,所以会匹配到第一个url,这时候就执行view.page这个视图函数,而在page函数中,又有num=1这个默认参数。因此这时候就可以不用传递参数。而如果访问blog/1的时候,因为在传递参数的时候传递了num,因此会匹配到第二个url,这时候也会执行views.page,然后把传递进来的参数传给page函数中的num。