评估:DIY Django 迷你博客
在本评估中,您将使用在Django Web 框架 (Python)模块中学习到的 Django 知识来创建一个非常基本的博客。
先决条件 | 在尝试此评估之前,您应该已经完成了本模块中的所有文章。 |
---|---|
目标 | 测试对 Django 基础知识的理解,包括 URL 配置、模型、视图、表单和模板。 |
项目简介
需要显示的页面、它们的 URL 和其他要求列在下面
页面 | URL | 要求 |
---|---|---|
首页 | / 和 /blog/ |
描述网站的索引页面。 |
所有博客文章列表 | /blog/blogs/ |
所有博客文章列表
|
博客作者(博主)详情页面 | /blog/blogger/<author-id> |
指定作者(按 ID)的信息及其博客文章列表
|
博客文章详情页面 | /blog/<blog-id> |
博客文章详情。
|
所有博主列表 | /blog/bloggers/ |
系统上所有博主的列表
|
评论表单页面 | /blog/<blog-id>/create |
为博客文章创建评论
|
用户身份验证页面 | /accounts/<standard urls> |
用于登录、注销和设置密码的标准 Django 身份验证页面
|
管理站点 | /admin/<standard urls> |
应启用管理站点以允许创建/编辑/删除博客文章、博客作者和博客评论(这是博主创建新博客文章的机制)
|
此外,您还应该编写一些基本测试以验证
- 所有模型字段都具有正确的标签和长度。
- 所有模型都具有预期的对象名称(例如,
__str__()
返回预期的值)。 - 模型具有单个博客和评论记录的预期 URL(例如,
get_absolute_url()
返回预期的 URL)。 - BlogListView(所有博客页面)可在预期位置访问(例如,/blog/blogs)
- BlogListView(所有博客页面)可在预期的命名 URL 处访问(例如,“blogs”)
- BlogListView(所有博客页面)使用预期的模板(例如,默认模板)
- BlogListView 按 5 个分页记录(至少在第一页上)
注意:当然,您可以运行许多其他测试。请自行判断,但我们希望您至少进行上述测试。
以下部分显示了实现上述要求的站点的屏幕截图。
屏幕截图
以下屏幕截图提供了完成的程序应输出内容的示例。
所有博客文章列表
这显示了所有博客文章的列表(可从侧边栏中的“所有博客”链接访问)。需要注意的事项
- 侧边栏还列出了已登录的用户。
- 各个博客文章和博主都可以作为页面中的链接访问。
- 启用了分页(每组 5 个)。
- 排序顺序为最新到最旧。
所有博主列表
这提供了所有博主的链接,这些链接是从侧边栏中的“所有博主”链接链接的。在这种情况下,我们可以从侧边栏看到没有用户登录。
博客详情页面
这显示了特定博客的详情页面。
请注意,评论有日期和时间,并且按从最旧到最新的顺序排序(与博客排序相反)。最后,我们有一个链接,用于访问添加新评论的表单。如果用户未登录,我们将看到建议登录的提示。
添加评论表单
这是添加评论的表单。请注意,我们已登录。成功后,我们应该被带回关联的博客文章页面。
作者简介
这显示了博主的个人信息以及他们的博客文章列表。
完成步骤
以下部分描述了您需要执行的操作。
- 为站点创建一个骨架项目和 Web 应用程序(如Django 教程第 2 部分:创建骨架网站中所述)。您可以使用“diyblog”作为项目名称,使用“blog”作为应用程序名称。
- 为博客文章、评论和任何其他需要的对象创建模型。在考虑设计时,请记住
- 每个评论只有一个博客,但一个博客可能有许多评论。
- 博客文章和评论必须按发布日期排序。
- 并非每个用户都一定是博客作者,尽管任何用户都可能是评论者。
- 博客作者还必须包含个人信息。
- 为新模型运行迁移并创建超级用户。
- 使用管理站点创建一些示例博客文章和博客评论。
- 为博客文章和博主列表页面创建视图、模板和 URL 配置。
- 为博客文章和博主详情页面创建视图、模板和 URL 配置。
- 创建一个包含表单的页面,用于添加新评论(请记住,这仅供已登录用户使用!)。
提示和技巧
此项目与LocalLibrary教程非常相似。您可以使用几乎相同的方法设置骨架、用户登录/注销行为、静态文件支持、视图、URL、表单、基本模板和管理站点配置。
一些常规提示
- 索引页面可以实现为一个基本函数视图和模板(就像 locallibrary 一样)。
- 博客文章和博主的列表视图以及博客文章的详情视图可以使用通用列表和详情视图创建。
- 特定作者的博客文章列表可以通过使用通用博客列表视图并筛选与指定作者匹配的博客对象来创建。
- 您将必须实现
get_queryset(self)
来执行筛选(非常类似于我们的库类LoanedBooksAllListView
)并从 URL 中获取作者信息。 - 您还需要将作者的名称传递到上下文中的页面。要在基于类的视图中执行此操作,您需要实现
get_context_data()
(如下所述)。
- 您将必须实现
- “添加评论”表单可以使用基于函数的视图(以及关联的模型和表单)或使用通用
CreateView
创建。如果您使用CreateView
(推荐),则- 您还需要将博客文章的名称传递到上下文中的评论页面(实现
get_context_data()
,如下所述)。 - 该表单应仅显示评论“描述”供用户输入(日期和关联的博客文章不可编辑)。由于它们不在表单本身中,因此您的代码需要在
form_valid()
函数中设置评论的作者,以便可以将其保存到模型中(此处所述 - Django 文档)。在同一个函数中,我们设置关联的博客。下面显示了一个可能的实现(pk
是从 URL/URL 配置中传递的博客 ID)。pythondef form_valid(self, form): """ Add author and associated blog to form data before setting it as valid (so it is saved to model) """ #Add logged-in user as author of comment form.instance.author = self.request.user #Associate comment with blog based on passed id form.instance.blog=get_object_or_404(Blog, pk = self.kwargs['pk']) # Call super-class form validation behavior return super(BlogCommentCreate, self).form_valid(form)
- 您需要提供一个成功 URL,在表单验证后重定向到该 URL;这应该是原始博客。为此,您需要覆盖
get_success_url()
并“反转”原始博客的 URL。您可以使用self.kwargs
属性获取所需的博客 ID,如上面的form_valid()
方法中所示。
- 您还需要将博客文章的名称传递到上下文中的评论页面(实现
我们在Django 教程第 6 部分:通用列表和详情视图主题中简要讨论了将上下文传递到基于类的视图中的模板。为此,您需要覆盖get_context_data()
(首先获取现有上下文,使用您想要传递到模板的任何其他变量更新它,然后返回更新后的上下文)。例如,以下代码片段显示了如何根据其BlogAuthor
ID 将博主对象添加到上下文中。
class SomeView(generic.ListView):
# …
def get_context_data(self, **kwargs):
# Call the base implementation first to get a context
context = super(SomeView, self).get_context_data(**kwargs)
# Get the blogger object from the "pk" URL parameter and add it to the context
context['blogger'] = get_object_or_404(BlogAuthor, pk = self.kwargs['pk'])
return context
评估
此任务的评估可在 GitHub 上找到。此评估主要基于您的应用程序在多大程度上满足了我们上面列出的要求,尽管评估的某些部分会检查您的代码是否使用了适当的模型,以及您是否编写了一些测试代码。完成后,您可以查看完成的示例,该示例反映了一个“满分”项目。
完成本模块后,您也完成了学习基本 Django 服务器端网站编程的所有 MDN 内容!我们希望您喜欢本模块,并相信您已经很好地掌握了基础知识!