挑战:DIY Django 迷你博客

在这个挑战中,你将运用你在Django Web 框架 (Python)模块中学到的 Django 知识来创建一个非常基础的博客。

预备知识 在尝试此挑战之前,你应该已经完成了此模块中的所有文章。
目标 为了测试对 Django 基础知识的理解,包括 URL 配置、模型、视图、表单和模板。

项目简介

需要显示的页面、它们的 URL 和其他要求列在下面

页面 URL 依赖项
主页 //blog/ 一个描述网站的索引页。
所有博客文章列表 /blog/blogs/

所有博客文章列表

  • 所有用户都可以通过侧边栏链接访问。
  • 列表按发布日期(最新到最旧)排序。
  • 列表按 5 篇文章进行分页。
  • 列表项显示博客标题、发布日期和作者。
  • 博客文章名称链接到博客详情页。
  • 博主(作者姓名)链接到博主详情页。
博主(作者)详情页 /blog/blogger/<author-id>

指定作者(通过 ID)的信息及其博客文章列表

  • 所有用户都可以通过博客文章中的作者链接等访问。
  • 包含博主/作者的一些生平信息。
  • 列表按发布日期(最新到最旧)排序。
  • 不分页。
  • 列表项只显示博客文章名称和发布日期。
  • 博客文章名称链接到博客详情页。
博客文章详情页 /blog/<blog-id>

博客文章详情。

  • 所有用户都可以通过博客文章列表访问。
  • 页面包含博客文章:名称、作者、发布日期和内容。
  • 博客文章的评论应显示在底部。
  • 评论应按顺序排序:从最旧到最新。
  • 包含在末尾为已登录用户添加评论的链接(参见评论表单页)
  • 博客文章和评论只需显示纯文本。无需支持任何 HTML 标记(例如,链接、图片、粗体/斜体等)。
所有博主列表 /blog/bloggers/

系统中的博主列表

  • 所有用户都可以通过网站侧边栏访问
  • 博主姓名链接到博主详情页。
评论表单页 /blog/<blog-id>/create

为博客文章创建评论

  • (仅)已登录用户可以通过博客文章详情页底部的链接访问。
  • 显示带有描述的表单,用于输入评论(发布日期和博客不可编辑)。
  • 评论发布后,页面将重定向回关联的博客文章页面。
  • 用户不能编辑或删除他们的帖子。
  • 未登录的用户将被定向到登录页面进行登录,然后才能添加评论。登录后,他们将被重定向回他们想评论的博客页面。
  • 评论页面应包含被评论博客文章的名称/链接。
用户身份验证页面 /accounts/<标准 URL>

用于登录、注销和设置密码的标准 Django 身份验证页面

  • 登录/注销应通过侧边栏链接访问。
管理站点 /admin/<标准 URL>

应启用管理站点,以允许创建/编辑/删除博客文章、博客作者和博客评论(这是博主创建新博客文章的机制)

  • 管理站点博客文章记录应以内联方式(在每篇博客文章下方)显示关联评论列表。
  • 管理站点中的评论名称是通过将评论描述截断为 75 个字符来创建的。
  • 其他类型的记录可以使用基本注册。

此外,您还应该编写一些基本测试来验证

  • 所有模型字段都具有正确的标签和长度。
  • 所有模型都具有预期的对象名称(例如,__str__() 返回预期值)。
  • 模型具有单个博客和评论记录的预期 URL(例如,get_absolute_url() 返回预期 URL)。
  • BlogListView(所有博客页面)可在预期位置访问(例如,/blog/blogs)
  • BlogListView(所有博客页面)可在预期命名 URL 访问(例如,'blogs')
  • BlogListView(所有博客页面)使用预期模板(例如,默认模板)
  • BlogListView 将记录分页为 5 条(至少在第一页)

注意:当然,还有许多其他测试可以运行。请自行决定,但我们期望您至少完成上述测试。

以下部分显示了实现上述要求的网站的截图

截图

以下截图提供了完成后的程序应输出的示例。

所有博客文章列表

这显示了所有博客文章的列表(可通过侧边栏中的“所有博客”链接访问)。需要注意的事项

  • 侧边栏还列出了已登录用户。
  • 单个博客文章和博主可作为页面中的链接访问。
  • 已启用分页(每组 5 个)
  • 排序方式是从最新到最旧。

List of all blogs

所有博主列表

这提供了所有博主的链接,这些链接来自侧边栏中的“所有博主”链接。在这种情况下,我们可以从侧边栏中看到没有用户登录。

List of all bloggers

博客详情页

这显示了特定博客的详情页。

Blog detail with add comment link

请注意,评论有日期时间,并且从最旧到最新排序(与博客排序相反)。最后,我们有一个链接用于访问添加新评论的表单。如果用户未登录,我们将看到登录提示。

Comment link when not logged in

添加评论表单

这是添加评论的表单。请注意,我们已登录。成功后,我们应该回到关联的博客文章页面。

Add comment form

作者简介

这显示了博主的简介信息以及他们的博客文章列表。

Blogger detail page

完成步骤

以下部分描述了您需要做什么。

  1. 为网站创建一个骨架项目和 Web 应用程序(如Django 教程第 2 部分:创建骨架网站中所述)。您可以将“diyblog”用作项目名称,将“blog”用作应用程序名称。

  2. 为博客文章、评论和任何其他所需对象创建模型。在考虑设计时,请记住

    • 每条评论将只有一个博客,但一个博客可以有许多评论。
    • 博客文章和评论必须按发布日期排序。
    • 并非每个用户都一定是博客作者,但任何用户都可能是评论者。
    • 博客作者还必须包含简介信息。
  3. 运行新模型的迁移并创建一个超级用户。

  4. 使用管理站点创建一些示例博客文章和博客评论。

  5. 为博客文章和博主列表页面创建视图、模板和 URL 配置。

  6. 为博客文章和博主详情页面创建视图、模板和 URL 配置。

  7. 创建一个包含用于添加新评论的表单的页面(请记住这仅对已登录用户可用!)

提示和技巧

这个项目与LocalLibrary教程非常相似。您将能够使用几乎所有相同的方法来设置骨架、用户登录/注销行为、静态文件支持、视图、URL、表单、基本模板和管理站点配置。

一些一般提示

  1. 索引页可以实现为一个基本的函数视图和模板(就像 locallibrary 一样)。

  2. 博客文章和博主的列表视图,以及博客文章的详细视图可以使用通用列表和详细视图创建。

  3. 特定作者的博客文章列表可以通过使用通用博客列表视图并筛选匹配指定作者的博客对象来创建。

    • 您必须实现 get_queryset(self) 来进行筛选(很像我们的库类 LoanedBooksAllListView),并从 URL 获取作者信息。
    • 您还需要在上下文中将作者姓名传递给页面。要在基于类的视图中执行此操作,您需要实现 get_context_data()(如下所述)。
  4. 添加评论表单可以使用基于函数的视图(和相关的模型和表单)或使用通用 CreateView 创建。如果您使用 CreateView(推荐),那么

    • 您还需要在上下文中将博客文章名称传递给评论页面(如下所述,实现 get_context_data())。

    • 表单应仅显示供用户输入的评论“描述”(日期和关联的博客文章不应可编辑)。由于它们不会在表单本身中,因此您的代码需要在 form_valid() 函数中设置评论的作者,以便将其保存到模型中(如此处所述——Django 文档)。在同一函数中,我们设置关联的博客。一个可能的实现如下所示(pk 是从 URL/URL 配置传入的博客 ID)。

      python
          def 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 将博主对象添加到上下文中。

python
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 服务器端网站编程!我们希望您喜欢这个模块,并觉得您很好地掌握了基础知识!