挑战: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/<标准 URL>
|
用于登录、注销和设置密码的标准 Django 身份验证页面
|
管理站点 |
/admin/<标准 URL>
|
应启用管理站点,以允许创建/编辑/删除博客文章、博客作者和博客评论(这是博主创建新博客文章的机制)
|
此外,您还应该编写一些基本测试来验证
- 所有模型字段都具有正确的标签和长度。
- 所有模型都具有预期的对象名称(例如,
__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,以便在表单验证后重定向到;这应该是原始博客。为此,您需要覆盖
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 上找到。此评估主要基于您的应用程序满足我们上面列出的要求的程度,尽管有些部分会检查您的代码是否使用了适当的模型,以及您是否编写了至少一些测试代码。完成后,您可以查看已完成的示例,它反映了一个“满分”项目。
一旦您完成了本模块,您也完成了所有 MDN 内容,用于学习基本的 Django 服务器端网站编程!我们希望您喜欢这个模块,并觉得您很好地掌握了基础知识!