制作页面:学习日志主页
使用 Django 制作网页包括三个阶段:定义 URL、编写视图和编写模板。您可以按照任何顺序完成这些工作,但在本项目中,我们总是从定义 URL 模式开始。URL 模式描述了 URL 的布局方式。它还告诉 Django 在将浏览器请求与网站 URL 匹配时要查找什么,这样它就知道要返回哪个页面。
然后,每个 URL 映射到一个特定的视图。视图函数检索并处理该页面所需的数据。视图函数通常使用包含页面整体结构的模板来渲染页面。
为了了解其工作原理,我们来制作学习日志的主页。我们将定义主页的 URL,编写其视图函数,并创建一个简单的模板。
因为我们只想确保学习日志能正常运行,所以我们先制作一个简单的页面。一个功能完善的网络应用程序在完成后的风格会很有趣;一个看起来不错但不能很好运行的应用程序是没有意义的。目前,主页将只显示标题和简要说明。
映射 URL
用户通过在浏览器中输入 URL 并点击链接来请求页面,因此我们需要确定需要哪些 URL。首先是主页 URL:它是用户访问项目的基础 URL。目前,基础 URL http://localhost:8000/ 会返回默认的 Django 网站,让我们知道项目已正确设置。我们将通过把基础 URL 映射到学习日志的主页来改变这种情况。
在 ll_project 主文件夹中,打开 urls.py 文件。你应该能看到以下代码:
from django.contrib import admin # 1
from django.urls import path
urlpatterns = [ # 2
path('admin/', admin.site.urls), # 3
]
前两行导入了管理模块和一个用于构建 URL 路径的函数❶。文件正文定义了 urlpatterns
变量❷。在为整个项目定义 URL 的 urls.py 文件中,urlpatterns
变量包含项目中各应用程序的 URL 集。该列表包括 admin.site.urls
模块,该模块定义了可从管理站点❸ 请求的所有 URL。
我们需要包含 learning_logs
的 URL,因此添加以下内容:
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('', include('learning_logs.urls')),
]
我们导入了 include()
函数,并添加了一行包含模块 learning_logs.urls
。
默认的 urls.py 位于 ll_project 文件夹中;现在我们需要在 learning_logs 文件夹中创建第二个 urls.py 文件。创建一个新的 Python 文件,在 learning_logs 中保存为 urls.py,然后输入以下代码:
"""Defines URL patterns for learning_logs.""" # 1
from django.urls import path # 2
from . import views # 3
app_name = 'learning_logs' # 4
urlpatterns = [ # 5
# Home page
path('', views.index, name='index'), # 6
]
为了明确我们在哪个 urls.py 文件中工作,我们在文件开头添加了一个 docstring ❶。然后,我们导入路径函数 ❷,这在将 URL 映射到视图时是必需的。我们还导入了视图模块 ❸;圆点告诉 Python 从当前 urls.py 模块的同一目录导入 views.py 模块。变量 app_name 帮助 Django 将 urls.py 文件与项目中其他应用程序的同名文件区分开来 ❹。该模块中的变量 urlpatterns 是可从 learning_logs 应用程序❺ 请求的单个页面的列表。
实际的 URL 模式是对 path() 函数的调用,它需要三个参数❻。第一个参数是一个字符串,用于帮助 Django 正确路由当前请求。Django 接收请求的 URL 并尝试将请求路由到视图。为此,它会搜索我们定义的所有 URL 模式,以找到与当前请求相匹配的模式。Django 会忽略项目的基本 URL (http://localhost:8000/),因此空字符串('')会匹配基本 URL。任何其他 URL 都不会与此模式匹配,如果请求的 URL 与任何现有 URL 模式不匹配,Django 将返回错误页面。
path() ❻ 中的第二个参数指定了要调用 views.py 中的哪个函数。当请求的 URL 与我们定义的模式匹配时,Django 会调用 views.py 中的 index() 函数。(第三个参数提供了该 URL 模式的名称索引,这样我们就可以在整个项目的其他文件中更容易地引用它。每当我们要提供指向主页的链接时,都会使用这个名称,而不是写出一个 URL。
编写视图
视图函数从请求中接收信息,准备生成页面所需的数据,然后将数据发送回浏览器。通常,视图函数会使用一个模板来定义页面的外观。
当我们运行 python manage.py startapp
命令时,learning_logs 中的 views.py 文件就自动生成了。下面是 views.py 文件中的内容:
from django.shortcuts import render
# Create your views here.
目前,该文件只导入了 render()
函数,它会根据 views 提供的数据渲染响应。打开 views.py,为主页添加以下代码:
from django.shortcuts import render
def index(request):
"""The home page for Learning Log."""
return render(request, 'learning_logs/index.xhtml')
当 URL 请求与我们刚刚定义的模式相匹配时,Django 会在 views.py 文件中查找一个名为 index() 的函数。Django 会将请求对象传递给该视图函数。在这种情况下,我们不需要处理页面的任何数据,因此函数中唯一的代码就是调用 render()。这里的 render() 函数会传递两个参数:原始请求对象和一个用于创建页面的模板。让我们来编写这个模板。
编写模板
模板定义了页面的外观,Django 会在每次请求页面时填写相关数据。模板允许您访问视图提供的任何数据。因为我们的主页视图不提供任何数据,所以这个模板相当简单。
在 learning_logs 文件夹中新建一个名为 templates 的文件夹。在 templates 文件夹中,新建一个名为 learning_logs 的文件夹。这看起来可能有点多余(我们在名为 learning_logs 的文件夹内建立了一个名为 learning_logs 的文件夹,在名为 templates 的文件夹内建立了一个名为 learning_logs 的文件夹),但它建立了一个 Django 可以明确解释的结构,即使在包含许多单独应用程序的大型项目中也是如此。在内部的 learning_logs 文件夹中,新建一个名为 index.xhtml 的文件。文件路径为 ll_project/learning_logs/templates/learning_logs/index.xhtml。在该文件中输入以下代码:
<p>Learning Log</p>
<p>Learning Log helps you keep track of your learning, for any topic you're
interested in.</p>
这是一个非常简单的文件。如果你不熟悉 HTML,<p></p> 标记表示段落。<p> 标签打开一个段落,</p> 标签关闭一个段落。我们有两个段落:第一个段落作为标题,第二个段落描述用户可以用学习日志做什么。
现在,当您请求项目的基本 URL http://localhost:8000/ 时,您将看到我们刚刚创建的页面,而不是默认的 Django 页面。Django 将获取请求的 URL,该 URL 将与模式 '' 匹配;然后 Django 将调用 views.index() 函数,该函数将使用 index.xhtml 中的模板渲染页面。图 18-3 显示了生成的页面。

虽然创建一个页面的过程可能看起来很复杂,但这种将 URL、视图和模板分开的做法效果很好。它允许你分别考虑项目的各个方面。在大型项目中,它可以让参与项目的个人专注于自己最擅长的领域。例如,数据库专家可以专注于模型,程序员可以专注于视图代码,而前端专家可以专注于模板。
您可能会看到以下错误信息:
如果是这样,请在发出 |