評估: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 內容!我們希望您喜歡本模組,並相信您已經很好地掌握了基礎知識!