创建主页
三个阶段:定义URL,编写视图和编写模板
1.映射URL
打开项目主文件夹learning_log中的文件urls.py
在这个针对整个项目的urls.py文件中,变量urlpatterns 包含项目中应用程序的URL。代码包含模块admin.site.urls ,该模块定义了可在管理网站中请求的所有URL。
主文件夹中的urls.py修改为:
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('', include('learning_logs.urls')),
]
默认的urls.py包含在文件夹learning_log中,现在需要在文件夹learning_logs中再创建一个urls.py文件。
为此,新建一个文件,使用文件名urls.py将其存储到文件夹learning_logs中,再在这个应用程序中的urls.py文件中输入如下代码:
"""定义learning_logs的URL模式。"""
from django.urls import path
from . import views
app_name = 'learning_logs'
urlpatterns = [
# 主页
path('', views.index, name='index'),
]
其中的句点让Python从当前urls.py模块所在的文件夹导入views.py。变量app_name 让Django能够将这个urls.py文件同项目内其他应用程序中的同名文件区分开来。
在这个模块中,变量urlpatterns 是一个列表,包含可在应用程序learning_logs 中请求的页面。
实际的URL模式是对函数path() 的调用,这个函数接受三个实参。
第一个实参是一个字符串,帮助Django正确地路由(route)请求。收到请求的URL后,Django力图将请求路由给一个视图。为此,它搜索所有的URL模式,找到与当前请求匹配的那个。Django忽略项目的基础URL(http://localhost:8000/),因此空字符串('' )与基础URL匹配。其他URL都与这个模式不匹配。如果请求的URL与任何既有的URL模式都不匹配,Django将返回一个错误页面。
第二个实参指定了要调用view.py中的哪个函数。请求的URL与前述正则表达式匹配时,Django将调用view.py中的函数index() 。
第三个实参将这个URL模式的名称指定为index ,让我们能够在代码的其他地方引用它。每当需要提供到这个主页的链接时,都将使用这个名称,而不编写URL。
2.编写视图
learning_logs中的文件views.py是执行命令python manage.py startapp 时自动生成的,将其修改为:
from django.shortcuts import render
def index(request):
"""学习笔记的主页。"""
return render(request, 'learning_logs/index.html')
URL请求与刚才定义的模式匹配时,Django将在文件views.py中查找函数index() ,再将对象request 传递给这个视图函数。
这里不需要处理任何数据,因此这个函数只包含调用render() 的代码。这里向函数render() 提供了两个实参:对象request 以及一个可用于创建页面的模板。
3.创建页面的模板
在文件夹learning_logs中新建一个文件夹,并将其命名为templates。在文件夹templates中,再新建一个文件夹,并将其命名为learning_logs。这好像有点多余(在文件夹learning_logs中创建文件夹templates,又在这个文件夹中创建文件夹learning_logs),但是建立了Django能够明确解读的结构,即便项目很大、包含很多应用程序亦如此。在最里面的文件夹learning_logs中,新建一个文件,并将其命名为index.html(这个文件的路径为learning_log/learning_logs/templates/ learning_logs/index.html),再在其中编写如下代码:
index.html:
<p>Learning Log</p>
<p>Learning Log helps you keep track of your learning, for any topic you're
learning about.</p>
标签<p></p> 标识段落。标签<p> 指出段落的开头位置,而标签</p> 指出段落的结束位置。这里定义了两个段落:第一个充当标题,第二个阐述了用户可使用“学习笔记”来做什么。
现在,如果请求这个项目的基础URL http://localhost:8000/,将看到刚才创建的页面,而不是默认的Django页面。Django接受请求的URL,发现该URL与模式'' 匹配,因此调用函数views.index() 。这将使用index.html包含的模板来渲染页面。