从115开始,之后的示例,都基于一个叫KNote的项目!
假设我们建立了一个项目:KNote,其下暂时只有一个APP:notebook。要访问notebook下的某个页面,按照工程的层级结构来说,是project——》app,记住这个层级关系!
第一部分,关于include
建立KNote项目后,在根目录下直接会有一个urls.py文件,这将是之后所有页面的一级入口,包括admin后台,如果要访问某个app下面的页面,通常使用路由的方式,即:include。
from django.contrib import admin from django.urls import path, include urlpatterns = [ path('admin/', admin.site.urls), path('nb/', include('notebook.nb_urls')), ]
第一个path毫无疑问,是指向admin后台的,第二个path,指向notebook下的二级urls文件。
在什么情况下会只指向notebook下的urls,当用户的网址用输入了xxx/nb/之后,比如http://127.0.0.1:8000/nb/...
如果nb后面还有其他内容,会去nb_urls这个文件去匹配。
from django.urls import path from . import views app_name = 'notebook' urlpatterns = [ path('start_page/', views.start_page, name='start_page'), path('note/<int:pk>', views.one_note, name='one_note'), ]
如果输入的是nb/start_page/,会运行views.py文件里的start_page函数,注意:此时,即便没有后面的name='start_page',也不影响运行。如果是用户输入的网址里的内容,通过直接会用path里的第一部分进行匹配。
第二部分,关于app_name和url的name属性
要前往某个网页,并不总是通过地址栏输入然后敲回车键实现的。很多情况下,是在一个网页里,点击一个链接,然后打开另外一个页面。此时就不能用path的第一部分来匹配了,需要使用url的name属性。
假设有如下场景:在首页列举最新的10篇文章的摘要,然后给这10篇文章添加链接,使可以显示这篇文章的完整内容。
这个流程的第一步是10篇文章的摘要页面:
<div>
{% for note in ten_note %}
<h3><a href="{% url 'notebook:one_note' note.pk %}">{{note.title}}</a></h3>
<p>Create time:{{note.pub_time}} Update time:{{note.update_time}}</p>
{% autoescape off %}
<p>{{note.content|truncatechars:128}}</p>
{% endautoescape %}
<p>{{note.personal_tags.all}}</p>
{% endfor %}
</div>
通过上下文传入的ten_note,是处理过的数据,文章列表的一个切片:最近10篇。通过for选择一个,然后把各种内容呈现出来,然后再依次显示后面9篇。
- title,添加了链接
- 显示创建时间和更新时间
- 显示最近128字的摘要,并且关掉转义,因为这里面集成了富文本模块
- 显示标签
关于title里的链接:
<a href="{% url 'notebook:one_note' note.pk %}">{{note.title}}</a>
格式为(不要用逗号,全部是空格):
url关键字,
一个url命名空间:此空间里的某个url的名称,
要传入的参数(可选)。
联合起来表示为:到这个namespace(app_name)里的url文件里,找name='one_note'的path,并且给他传个参数。
也就是对应这个path:
path('note/<int:pk>', views.one_note, name='one_note'),
注意,这个namespace(app_name)的写法,它当前写作notebook,但其实可以和这个app的name不一样,只要模板里的名称,和app的urls的名称一致即可。查看前文的红色字部分。