Assessment: DIY Django mini blog

 

在此评估中,您将使用在Django Web框架(Python)模块中获得的Django知识来创建一个非常基本的博客.

Prerequisites: 在尝试进行此评估之前,您应该已经阅读了本模块中的所有文章.
Objective: 测试对Django基础的理解,包括URL配置,模型,视图,表单和模板.

Project brief

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

Page URL Requirements
主页 / and /blog/ 描述站点的索引页.
所有博客文章列表 /blog/blogs/

所有博客文章列表:

  • 所有用户都可以通过侧边栏链接访问.
  • 列表按发布日期排序(最新到最旧).
  • 以5篇文章为一组的分页列表.
  • 列表项显示博客标题,发布日期和作者.
  • 博客帖子名称链接到博客详细信息页面.
  • Blogger(作者姓名)链接到博客作者详细信息页面.
博客作者(博客)详细信息页面 /blog/blogger/<author-id>

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

  • 所有用户均可通过博客文章等中的作者链接访问.
  • 包含有关博客作者/作者的一些传记信息.
  • 列表按发布日期排序(最新到最旧).
  • Not paginated.
  • 列表项仅显示博客文章名称和文章日期.
  • 博客帖子名称链接到博客详细信息页面.
博客文章详细信息页面 /blog/<blog-id>

博客文章详细信息.

  • 博客文章列表中的所有用户均可访问.
  • 页面包含博客文章:名称,作者,文章日期和内容.
  • 博客文章的评论应显示在底部.
  • 注释应按顺序排序:从最早到最新.
  • 包含用于在末尾为已登录用户添加评论的链接(请参阅评论表单页面)
  • 博客文章和评论仅需要显示纯文本. 无需支持任何类型的HTML标记(例如,链接,图像,粗体/斜体等).
所有博客列表 /blog/bloggers/

系统上的博客作者列表:

  • 网站侧边栏的所有用户均可访问
  • Blogger名称链接到Blog作者详细信息页面.
评论表格页面 /blog/<blog-id>/create

为博客文章创建评论:

  • 可通过博客文章详细信息页面底部的链接(仅)访问登录用户.
  • 显示带有用于输入评论的描述的表单(发布日期和博客不可编辑).
  • 发表评论后,该页面将重定向回相关的博客文章页面.
  • 用户无法编辑或删除他们的帖子.
  • 注销的用户将被定向到登录页面进行登录,然后才能添加评论. 登录后,他们将被重定向回他们要评论的博客页面.
  • 评论页面应包含被评论博客文章的名称/链接.
用户认证页面 /accounts/<standard urls>

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

  • 应该可以通过边栏链接访问登录/退出.
管理网站 /admin/<standard urls>

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

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

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

  • 所有型号字段均具有正确的标签和长度.
  • 所有模型都有期望的对象名称(例如__str__()返回期望的值).
  • 模型具有单个Blog和Comment记录的预期URL(例如, get_absolute_url()返回预期URL).
  • 可在预期位置(例如/ blog / blogs)访问BlogListView(所有博客页面)
  • 可通过预期的命名url(例如'blogs')访问BlogListView(所有博客页面).
  • BlogListView(所有博客页面)使用预期的模板(例如默认模板)
  • BlogListView按5分页记录(至少在第一页上)

注意 :当然,您可以运行许多其他测试. 请您谨慎决定,但我们希望您至少进行上述测试.

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

Screenshots

以下屏幕截图提供了一个完整程序应输出的示例.

List of all blog posts

这将显示所有博客文章的列表(可从侧栏中的"所有博客"链接访问). 注意事项:

  • 侧边栏还会列出已登录的用户.
  • 单个博客文章和博客作者可以作为页面中的链接访问.
  • 分页已启用(以5为一组)
  • 订购从新到旧.

List of all blogs

List of all bloggers

这提供了到所有博客的链接,如侧边栏中的"所有博客"链接所链接. 在这种情况下,我们可以从侧栏中看到没有用户登录.

List of all bloggers

Blog detail page

这将显示特定博客的详细信息页面.

Blog detail with add comment link

请注意,注释具有日期时间,并且按从最早到最新的顺序排序(与博客排序相反). 最后,我们有一个链接,用于访问表单以添加新注释. 如果用户未登录,我们会看到登录提示.

Comment link when not logged in

Add comment form

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

Add comment form

Author bio

这将显示博客的生物信息以及他们的博客文章列表.

Blogger detail page

Steps to complete

以下各节描述了您需要做什么.

  1. 为该站点创建一个框架项目和Web应用程序(如Django教程第2部分:创建框架网站中所述 ). 您可以使用" diyblog"作为项目名称,并使用" blog"作为应用程序名称.
  2. 为Blog帖子,评论和所需的任何其他对象创建模型. 在考虑您的设计时,请记住:
    • 每个评论只有一个博客,但是一个博客可能有很多评论.
    • 博客文章和评论必须按发布日期排序.
    • 尽管任何用户都可以是评论者,但并不是每个用户都一定是博客作者.
    • 博客作者还必须包括生物信息.
  3. 为新模型运行迁移并创建超级用户.
  4. 使用管理站点创建一些示例博客文章和博客评论.
  5. 为博客文章和博客列表页面创建视图,模板和URL配置.
  6. 为博客文章和博客详细信息页面创建视图,模板和URL配置.
  7. 创建一个带有用于添加新评论的表单的页面(请记住,仅将其提供给已登录的用户!)

Hints and tips

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

一些一般性提示:

  1. 索引页可以实现为基本功能视图和模板(就像本地库一样).
  2. 博客文章和博客作者的列表视图以及博客文章的详细信息视图可以使用通用列表和详细信息视图创建 .
  3. 可以使用通用博客列表视图并过滤与指定作者匹配的博客对象来创建特定作者的博客文章列表.
    • 您将必须实现get_queryset(self)进行过滤(类似于在我们的库类LoanedBooksAllListView ),并从URL获取作者信息.
    • 您还需要将作者的名称传递到上下文中的页面. 要在基于类的视图中执行此操作,您需要实现get_context_data() (在下面讨论).
  4. 可以使用基于函数的视图(以及关联的模型和表单)或使用通用的CreateView来创建添加注释表单. 如果使用CreateView (推荐),则:
    • 您还需要将博客文章的名称传递到上下文中的评论页面(实现get_context_data() ,如下所述).
    • 该表单应仅显示用于用户输入的注释"描述"(日期和相关博客文章不可编辑). 由于它们本身不在表单中,因此您的代码将需要在form_valid()函数中设置注释的作者,以便将其保存到模型中( 如此处所述 — Django docs). 在相同的功能中,我们设置关联的博客. 可能的实现如下所示( pk是从URL / URL配置传入的博客ID).
        def form_valid(自我,形式):
               ""
               将作者和相关博客添加到表单数据中,然后再将其设置为有效(因此将其保存到模型中)
               ""
               #将登录用户添加为评论作者
               form.instance.author = self.request.user
               #根据传递的ID将评论与博客相关联
               form.instance.blog = get_object_or_404(博客,pk = self.kwargs ['pk'])
               #调用超类表单验证行为
               返回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

Assessment

Github提供了此任务的评估. 该评估主要基于您的应用程序满足我们上面列出的要求的程度,尽管评估中的某些部分检查您的代码是否使用适当的模型,并且您至少编写了一些测试代码. 完成后,您可以查看完成的示例该示例反映了"满分"项目.

完成本模块后,您还将完成所有MDN内容,以学习基本的Django服务器端网站编程! 我们希望您喜欢这个模块,并希望您对基础知识有很好的了解!

In this module