Django搭建個人部落格:完成修改文章功能
目前為止我們已經完成了文章的新建、刪除以及檢視,還剩最後一項,即對已經完成的文章進行修改。
實際上修改文章與新建文章有點類似,不同的地方有兩點:
- 修改是在原有文章的基礎上,因此需要傳遞id 指明具體需要修改的文章
-
載入頁面時需要將舊的內容作為預設值填寫到表單中,因此需要將文章物件傳遞到
html
中
按照這個思路,接下來先寫檢視函式。
檢視函式
在ariticle/views.py
中增加修改文章的檢視函式article_update()
:
article/views.py ... # 更新文章 def article_update(request, id): """ 更新文章的檢視函式 通過POST方法提交表單,更新titile、body欄位 GET方法進入初始表單頁面 id: 文章的 id """ # 獲取需要修改的具體文章物件 article = ArticlePost.objects.get(id=id) # 判斷使用者是否為 POST 提交表單資料 if request.method == "POST": # 將提交的資料賦值到表單例項中 article_post_form = ArticlePostForm(data=request.POST) # 判斷提交的資料是否滿足模型的要求 if article_post_form.is_valid(): # 儲存新寫入的 title、body 資料並儲存 article.title = request.POST['title'] article.body = request.POST['body'] article.save() # 完成後返回到修改後的文章中。需傳入文章的 id 值 return redirect("article:article_detail", id=id) # 如果資料不合法,返回錯誤資訊 else: return HttpResponse("表單內容有誤,請重新填寫。") # 如果使用者 GET 請求獲取資料 else: # 建立表單類例項 article_post_form = ArticlePostForm() # 賦值上下文,將 article 文章物件也傳遞進去,以便提取舊的內容 context = { 'article': article, 'article_post_form': article_post_form } # 將響應返回到模板中 return render(request, 'article/update.html', context) 複製程式碼
更新的檢視與建立文章非常相似,但又有點小區別:
redirect
編寫模板
模板檔案就與建立文章的更像了,不過我們這裡還是重新寫一遍。
新建templates/article/update.html
並寫入:
templates/article/update.html {% extends "base.html" %} {% load staticfiles %} {% block title %} 更新文章 {% endblock title %} {% block content %} <div class="container"> <div class="row"> <div class="col-12"> <br> <form method="post" action="."> {% csrf_token %} <div class="form-group"> <label for="title">文章標題</label> <!-- 在 value 屬性中指定文字框的初始值為舊的內容,即 article 物件中的 title 欄位 --> <input type="text" class="form-control" id="title" name="title" value="{{ article.title }}"> </div> <div class="form-group"> <label for="body">文章正文</label> <!-- 文字域不需要 value 屬性,直接在標籤體中嵌入資料即可 --> <textarea type="text" class="form-control" id="body" name="body" rows="12">{{ article.body }}</textarea> </div> <button type="submit" class="btn btn-primary">完成</button> </form> </div> </div> </div> {% endblock content %} 複製程式碼
在模板中,分別將文章舊的標題和正文作為初始值,傳遞了進去,其他就與新建文章的模板完全沒區別了。
有讀者可能就會問了,既然這兩個函式、模板都很相似,**能不能合併成一個函式、模板呢?**當然是可以的,合併相同功能的函式可以讓程式碼更加簡潔漂亮,也便於後期的維護。有興趣的讀者可以自己嘗試一下。
URL 和入口
接下來的套路都懂的,配置路由article/urls.py
:
article/urls.py ... urlpatterns = [ ... # 更新文章 path('article-update/<int:id>/', views.article_update, name='article_update'), ] 複製程式碼
在文章詳情頁面tempaltes/article/detail.html
中新增修改文章的入口:
tempaltes/article/detail.html ... <div class="col-12 alert alert-success">作者:{{ article.author }} · <a href="#" onclick="confirm_delete()">刪除文章</a> · <a href="{% url "article:article_update" article.id %}">編輯文章</a> </div> 複製程式碼
啟動伺服器,可以看到修改文章的功能就實現了。同樣的,如有故障也不要著急,在Debug頁面尋找出錯的線索,求助網路幫忙解決吧。
總結
至此我們就實現了一篇文章的增、刪、改、查四個基礎功能,也算小有成就。
當然還有很多進階的功能可以去做,不過我們在這裡先休息休息,來罐快樂水慶祝一下。
下一章開始解決更加燃眉之急的內容:使用者管理。
- 有疑問請在杜賽的個人網站留言,我會盡快回復。
- 或Email私信我:[email protected]
- 專案完整程式碼:ofollow,noindex">Django_blog_tutorial
轉載請告知作者並註明出處。