Django: 添加公開留言與履歷列表功能
更新日期: 2024 年 12 月 1 日
本文為 Django 會員系統建立教學,第 1 篇:
- 設計登入與註冊功能的基礎路由與頁面配置
- Django 使用者密碼加密方式詳解
- 使用 Django 內建功能實現使用者註冊與登入
- 使用 Django 實現安全登出功能:完整指南
- Django 使用者登入與資料操作的最佳實踐
- Django: 添加公開留言與履歷列表功能 👈 所在位置
- 使用 Alpine.js 和 Django 動態管理留言按鈕啟用狀態
- Django 收藏功能的實現:使用 ManyToMany 關係與自定義中介模型
建議閱讀本文前,先閱讀完 Django 與前端框架教學 系列文
本篇教學將介紹如何在 Django 中實現公開留言與履歷列表功能,並針對目前的系統進行改良,包括:
- 新增公開留言頁面。
- 調整模板以支持用戶與訪客的不同行為。
- 新增公開履歷列表。
新增公開留言頁面
更新 URL 路由
在 resumes/urls.py
中新增路由 <int:id>/public
,對應公開留言的功能。
檔案位置:resumes/urls.py
from django.urls import path
from . import views
from comments import views as comment_views
app_name = "resumes"
urlpatterns = [
path("", views.index, name="index"),
path("list", views.list, name="list"),
path("new", views.new, name="new"),
path("<int:id>", views.show, name="show"),
path("<int:id>/edit", views.edit, name="edit"),
path("<int:id>/delete", views.delete, name="delete"),
path("<int:id>/comments", comment_views.index, name="comments"),
path("<int:id>/public", views.public, name="public"), # 新增公開頁面路徑
]
新增 Public 視圖函數
檔案位置:resumes/views.py
複製現有的 show
函數進行調整:
from django.shortcuts import get_object_or_404, render
from .models import Resume
def public(request, id):
resume = get_object_or_404(Resume, id=id)
comments = resume.comment_set.all() # 獲取與該履歷相關的留言
return render(
request,
"resumes/show.html", # 使用現有模板
{
"resume": resume,
"comments": comments,
},
)
調整模板以支持訪客與使用者的行為
公開頁面應區分訪客與登入用戶的操作權限,例如:
- 登入用戶:可以新增、編輯或刪除留言。
- 訪客:僅能瀏覽內容。
修改 show.html
模板
新增邏輯判斷,當前登入的用戶是否為履歷的所有者。
檔案位置:resumes/templates/resumes/show.html
{% extends "shared/layout.html" %}
{% block "content" %}
<h1>{{ resume.title }}</h1>
<h3>{{ resume.skill }}</h3>
<article>
<p>{{ resume.content }}</p>
</article>
{% if resume.user == user %}
<footer>
<a href="{% url 'resumes:edit' resume.id %}" class="btn btn-sm">編輯</a>
<a href="{% url 'resumes:delete' resume.id %}" class="btn btn-sm">刪除</a>
</footer>
{% endif %}
<section>
<form class="flex flex-col gap-2"
hx-target="#comment-list"
x-data="comment_form"
hx-swap="afterbegin"
hx-post="{% url 'resumes:comments' resume.id %}">
{% csrf_token %}
<div class="form-control">
<textarea x-model="content" name="content" class="textarea textarea-bordered"></textarea>
</div>
<div>
<button x-ref="btn" class="btn btn-md btn-primary">
新增留言
</button>
</div>
</form>
</section>
<ul id="comment-list">
{% for comment in comments %}
{% include "comments/_comment.html" with comment=comment %}
{% endfor %}
</ul>
{% endblock %}
判定條件:{% if resume.user == user %}
代碼解析
<code>{% if resume.user == user %}
<footer>
<a href="{% url 'resumes:edit' resume.id %}" class="btn btn-sm">編輯</a>
<a href="{% url 'resumes:delete' resume.id %}" class="btn btn-sm">刪除</a>
</footer>
{% endif %}
</code>
功能說明
resume.user
:指向當前履歷的所有者。這是Resume
模型中的一個ForeignKey
,對應到User
模型。user
:當前登入的使用者,Django 在每個請求中都自動附加該變數,代表當前認證的使用者。
判定邏輯
- 如果
resume.user
(履歷所有者)與user
(當前登入使用者)相同,則顯示「編輯」和「刪除」按鈕。 - 否則,不顯示這些操作按鈕,保護資料不被非所有者修改或刪除。
新增公開履歷列表
為支持訪客查看公開的履歷內容,需新增公開履歷列表功能。
更新模板:履歷列表
在 index.html
中新增條件,區分登入用戶與訪客顯示的內容。
檔案位置:resumes/templates/resumes/index.html
{% extends "shared/layout.html" %}
{% block "content" %}
{% if user.is_authenticated %}
<h1 class="text-3xl">個人履歷</h1>
<a href="{% url 'resumes:new' %}" class="btn btn-primary">新增 resume</a>
{% endif %}
<ul>
{% for resume in resumes %}
<li>
{% if user.is_authenticated %}
<a href="{% url 'resumes:show' resume.id %}">
{{ resume.title }}
</a>
{% else %}
<a href="{% url 'resumes:public' resume.id %}">
{{ resume.title }}
</a>
{% endif %}
</li>
{% endfor %}
</ul>
{% endblock %}
判定條件:{% if user.is_authenticated %}
代碼解析
{% if user.is_authenticated %}
<h1 class="text-3xl">個人履歷</h1>
<a href="{% url 'resumes:new' %}" class="btn btn-primary">新增 resume</a>
{% endif %}
功能說明
user.is_authenticated
:Django 提供的屬性,用於檢查當前使用者是否已登入。- 如果
user.is_authenticated
為True
,則顯示新增履歷的按鈕,否則不顯示。
判定標準的差異
resume.user == user
與 user.is_authenticated
條件 | 用途 | 適用場景 |
---|---|---|
resume.user == user | 判定履歷是否屬於當前登入使用者。需進一步驗證所有權。 | 用於敏感操作(如編輯或刪除)。 |
user.is_authenticated | 判定使用者是否已登入,僅關心登入狀態,與具體的內容所有權無關。 | 用於通用功能(如顯示新增按鈕)。 |
小結
透過新增公開留言與履歷列表功能,我們成功擴展了系統的使用場景。具體改進包括:
- 新增公開留言頁面:允許訪客查看履歷及相關留言。
- 分層功能:區分登入用戶與訪客,提供不同的行為邏輯。
- 體驗優化:通過 HTMX 和 Alpine.js 改善互動性能。
希望本篇內容能幫助新手了解如何靈活應用 Django 架構,實現更豐富的功能!