在django入门1:django框架的简介与内部执行流程分析 这一章节中我们介绍到了我们的url请求是通过urls.py中的url正则表达式匹配,然后才找到views.py中的处理方法的,或者是可以直接根据name=“xxx"来找到views.py中的处理方法方法,例如。
<a href="{% url 'user_detail' pk=user.id %}">查看</a>
1这是根据用户id查询用户详细资料的请求url格式,这是django特有的,再介绍一遍,{%%}里面的内容。
第一个'url'参数是固定写法。
第二个参数‘user_detail’就是上面所说的name='xxx'。
第三个参数'pk=user.id' 就是我们要传给后台的用户id,‘pk’就是id的意思,也可以写成id=user.id。
2:当我们在点击查看的链接时,它就会到blog/urls.py里面根据name='user_detail' 的这个name找到views.py里面的处理方法,先看看blog/urls.py里面的内容,如下
from django.conf.urls import url from .import views urlpatterns = [ # 跳转到用户详细页面(参数1:正则表达式url,参数2:views里面对应的处理方法,参数3:name='user_detail') url(r'^user/detail/(?P<pk>[0-9]+)/$', views.user_detail, name='user_detail'), ]
3:然后它会根据blog/urls.py里面的这个name发现views.py里面的处理方法是user_detail,于是它就找到了views里面的这个根据id查询用户信息的方法,如下。
# 跳转到用户详细信息pk就是id,随便选 def user_detail(request, pk): user = get_object_or_404(User, id=pk) # 跳转到对应的模板页面 return render(request, 'user/user_detail.html', {'user': user})
看了上面的这几个步骤,你一定会疑问,不是直接可以通过name找到views.py里面的处理方法了吗?那这样urls.py里面为什么还要用url正则表达式呢?先看看正则表达式,如下。
r'^user/detail/(?P<pk>[0-9]+)/$'
先学学django正则表达式。
^ 表示文本的开始 $ 表示文本的结束 \d 表示数字 + 表示前面的元素应该重复至少一次 () 用来捕捉模式中的一部分
这句话的意思是说我们可以通过http://127.0.0.1:8000/user/detail/1/ 来访问用户详细信息,那么你不是要给views.py一个id吗?我怎么知道到底“1”是参数还是“detail”是参数,因此我们就会在 [0-9]+ 的前面加上了"?P<>"这样的格式,它表示<>里面的pk(即id)就是要传给后台views.py的参数,也就是上面<a>标签href里面的第三个参数。
完成之后,页面通过{{}}取值,代码如下。
<body> 这是姓名:{{ user.username }}用户的详细信息页面 </body>
注意:看这个案例之前请结合前面几节的教程,不然可能看不懂。