评估:DIY Django 微博客

在这个评估中,你将使用你在 Django Web Framework (Python) 模块中获得的知识,来创建一个非常基本的博客。

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

项目概要

下面列出了需要显示的页面、URL 和其他要求:

页面 URL 要求
主页 //blog/ 描述站点的索引页面。
所有博客文章列表 /blog/blogs/

所有博客文章列表:

  • 可通过侧边栏链接访问所有用户。
  • 列表的排序按发布日期(从最新到最旧)。
  • 列表分页为每 5 篇文章 1 个分页。
  • 列表项显示博客标题,发布日期和作者。
  • 博客帖子名称,链接到博客详细信息页面。
  • 博主(作者姓名)链接到博客作者详细信息页面。
博客作者(博主)详细信息页面 /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(所有博客页面)可通过预期的命名网址访问(例如 'blogs')
  • BlogListView(所有博客页面)使用预期的模板(例如默认模板)
  • BlogListView 以 5 个记录为 1 个分页(至少在第一页上)

备注: 当然还有许多其他测试可以运行。请谨慎使用,但我们希望你至少进行上述测试。

以下部分,显示了实现上述要求的站点的屏幕截图。

截图

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

所有博客文章列表

这将显示所有博客帖子的列表(可从侧栏中的“所有博客”All blogs 链接访问)。注意事项:

  • 侧栏还列出了登录用户。
  • 个人博客帖子和博主可以作为页面中的链接访问。
  • 启用分页(以 5 个为一组)
  • 次序是从最新到最旧。

List of all blogs

所有博主的列表

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

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. T 可以使用通用列表和详细信息视图,以创建博客帖子和博主的列表视图,以及博客帖子的详细信息视图。
  3. 可以使用通用列表的博客列表视图,并对指定作者匹配的博客对象进行过滤,来创建特定作者的博客帖子列表。
    • 你将必须实现get_queryset(self)来进行过滤(很像我们的图书馆类LoanedBooksAllListView),并从 URL 获取作者信息。
    • 你还需要将作者的名称,传递给上下文中的页面。要在基于类的视图中执行此操作,你需要实现get_context_data()(在下面讨论)。
  4. 可以使用基于函数的视图(以及关联的模型和表单),或使用通用CreateView,以创建添加注释表单。如果你使用CreateView(推荐),那么:
    • 你还需要将博客文章的名称,传递到上下文中的评论页面(实现get_context_data() ,如下所述)。
    • 表单应仅显示用户输入的注释“description”(日期和相关的博客文章,不应该是可编辑的)。由于它们本身不在表单中,因此你的代码,需要在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 behaviour
              return super(BlogCommentCreate, self).form_valid(form)
      
    • 在表单验证后,你需要提供成功的 URL,以进行重新定向;这应该是原来的博客。为此,你需要覆盖 get_success_url(),并为原来的博客“反转”URL。你可以使用self.kwargs属性,获取所需的博客 ID,如上面的 form_valid() 方法所示。

我们简要地讨论了在Django 教程 6:通用列表和详细信息视图主题中,在基于类的视图中,将上下文传递给模板。要执行此操作,你需要覆盖get_context_data()(首先,获取现有上下文,使用要传递给模板的任何其他变量,更新它,然后返回更新的上下文)。例如,下面的代码片段,显示了如何根据BlogAuthor id,将 blogger 对象添加到上下文中。

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 服务器端网站编程》的内容!我们希望你喜欢这个模块,并感觉你已经掌握了基础知识!