挑戰: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 伺服器端網站程式設計!我們希望您喜歡這個模組,並覺得您很好地掌握了基礎知識!