代码改变世界

115-django中,关于incluede,namespace(app_name),和url的name属性

2020-08-11 22:55  lzhshn  阅读(225)  评论(0编辑  收藏  举报

从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篇。

  1. title,添加了链接
  2. 显示创建时间和更新时间
  3. 显示最近128字的摘要,并且关掉转义,因为这里面集成了富文本模块
  4. 显示标签

 

关于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的名称一致即可。查看前文的红色字部分。