评估: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/<standard urls>

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

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

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

  • 管理站点博客文章记录应内联显示关联评论列表(每个博客文章下方)。
  • 管理站点中的评论名称是通过将评论描述截断为 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,在表单验证后重定向到该 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 上找到。此评估主要基于您的应用程序在多大程度上满足了我们上面列出的要求,尽管评估的某些部分会检查您的代码是否使用了适当的模型,以及您是否编写了一些测试代码。完成后,您可以查看完成的示例,该示例反映了一个“满分”项目。

完成本模块后,您也完成了学习基本 Django 服务器端网站编程的所有 MDN 内容!我们希望您喜欢本模块,并相信您已经很好地掌握了基础知识!