挑戰:DIY Django 迷你部落格
在這個挑戰中,你將運用你在Django Web 框架 (Python)模組中學到的 Django 知識來建立一個非常基礎的部落格。
| 預備知識 | 在嘗試此挑戰之前,你應該已經完成了此模組中的所有文章。 |
|---|---|
| 目標 | 為了測試對 Django 基礎知識的理解,包括 URL 配置、模型、檢視、表單和模板。 |
專案簡介
需要顯示的頁面、它們的 URL 和其他要求列在下面
| 頁面 | URL | 依賴項 |
|---|---|---|
| 主頁 | / 和 /blog/ |
一個描述網站的索引頁。 |
| 所有部落格文章列表 | /blog/blogs/ |
所有部落格文章列表
|
| 博主(作者)詳情頁 |
/blog/blogger/<author-id>
|
指定作者(透過 ID)的資訊及其部落格文章列表
|
| 部落格文章詳情頁 |
/blog/<blog-id>
|
部落格文章詳情。
|
| 所有博主列表 | /blog/bloggers/ |
系統中的博主列表
|
| 評論表單頁 | /blog/<blog-id>/create |
為部落格文章建立評論
|
| 使用者身份驗證頁面 |
/accounts/<標準 URL>
|
用於登入、登出和設定密碼的標準 Django 身份驗證頁面
|
| 管理站點 |
/admin/<標準 URL>
|
應啟用管理站點,以允許建立/編輯/刪除部落格文章、部落格作者和部落格評論(這是博主建立新部落格文章的機制)
|
此外,您還應該編寫一些基本測試來驗證
- 所有模型欄位都具有正確的標籤和長度。
- 所有模型都具有預期的物件名稱(例如,
__str__()返回預期值)。 - 模型具有單個部落格和評論記錄的預期 URL(例如,
get_absolute_url()返回預期 URL)。 - BlogListView(所有部落格頁面)可在預期位置訪問(例如,/blog/blogs)
- BlogListView(所有部落格頁面)可在預期命名 URL 訪問(例如,'blogs')
- BlogListView(所有部落格頁面)使用預期模板(例如,預設模板)
- BlogListView 將記錄分頁為 5 條(至少在第一頁)
注意:當然,還有許多其他測試可以執行。請自行決定,但我們期望您至少完成上述測試。
以下部分顯示了實現上述要求的網站的截圖。
截圖
以下截圖提供了完成後的程式應輸出的示例。
所有部落格文章列表
這顯示了所有部落格文章的列表(可透過側邊欄中的“所有部落格”連結訪問)。需要注意的事項
- 側邊欄還列出了已登入使用者。
- 單個部落格文章和博主可作為頁面中的連結訪問。
- 已啟用分頁(每組 5 個)
- 排序方式是從最新到最舊。

所有博主列表
這提供了所有博主的連結,這些連結來自側邊欄中的“所有博主”連結。在這種情況下,我們可以從側邊欄中看到沒有使用者登入。

部落格詳情頁
這顯示了特定部落格的詳情頁。

請注意,評論有日期和時間,並且從最舊到最新排序(與部落格排序相反)。最後,我們有一個連結用於訪問新增新評論的表單。如果使用者未登入,我們將看到登入提示。

新增評論表單
這是新增評論的表單。請注意,我們已登入。成功後,我們應該回到關聯的部落格文章頁面。

作者簡介
這顯示了博主的簡介資訊以及他們的部落格文章列表。

完成步驟
以下部分描述了您需要做什麼。
-
為網站建立一個骨架專案和 Web 應用程式(如Django 教程第 2 部分:建立骨架網站中所述)。您可以將“diyblog”用作專案名稱,將“blog”用作應用程式名稱。
-
為部落格文章、評論和任何其他所需物件建立模型。在考慮設計時,請記住
- 每條評論將只有一個部落格,但一個部落格可以有許多評論。
- 部落格文章和評論必須按釋出日期排序。
- 並非每個使用者都一定是部落格作者,但任何使用者都可能是評論者。
- 部落格作者還必須包含簡介資訊。
-
執行新模型的遷移並建立一個超級使用者。
-
使用管理站點建立一些示例部落格文章和部落格評論。
-
為部落格文章和博主列表頁面建立檢視、模板和 URL 配置。
-
為部落格文章和博主詳情頁面建立檢視、模板和 URL 配置。
-
建立一個包含用於新增新評論的表單的頁面(請記住這僅對已登入使用者可用!)
提示和技巧
這個專案與LocalLibrary教程非常相似。您將能夠使用幾乎所有相同的方法來設定骨架、使用者登入/登出行為、靜態檔案支援、檢視、URL、表單、基本模板和管理站點配置。
一些一般提示
-
索引頁可以實現為一個基本的函式檢視和模板(就像 locallibrary 一樣)。
-
部落格文章和博主的列表檢視,以及部落格文章的詳細檢視可以使用通用列表和詳細檢視建立。
-
特定作者的部落格文章列表可以透過使用通用部落格列表檢視並篩選匹配指定作者的部落格物件來建立。
- 您必須實現
get_queryset(self)來進行篩選(很像我們的庫類LoanedBooksAllListView),並從 URL 獲取作者資訊。 - 您還需要在上下文中將作者姓名傳遞給頁面。要在基於類的檢視中執行此操作,您需要實現
get_context_data()(如下所述)。
- 您必須實現
-
新增評論表單可以使用基於函式的檢視(和相關的模型和表單)或使用通用
CreateView建立。如果您使用CreateView(推薦),那麼-
您還需要在上下文中將部落格文章名稱傳遞給評論頁面(如下所述,實現
get_context_data())。 -
表單應僅顯示供使用者輸入的評論“描述”(日期和關聯的部落格文章不應可編輯)。由於它們不會在表單本身中,因此您的程式碼需要在
form_valid()函式中設定評論的作者,以便將其儲存到模型中(如此處所述——Django 文件)。在同一函式中,我們設定關聯的部落格。一個可能的實現如下所示(pk是從 URL/URL 配置傳入的部落格 ID)。pythondef 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 將博主物件新增到上下文中。
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 伺服器端網站程式設計!我們希望您喜歡這個模組,並覺得您很好地掌握了基礎知識!