Django: 添加公開留言與履歷列表功能

更新日期: 2024 年 12 月 1 日

本篇教學將介紹如何在 Django 中實現公開留言與履歷列表功能,並針對目前的系統進行改良,包括:

  1. 新增公開留言頁面。
  2. 調整模板以支持用戶與訪客的不同行為。
  3. 新增公開履歷列表。

新增公開留言頁面

更新 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_authenticatedTrue,則顯示新增履歷的按鈕,否則不顯示。

判定標準的差異

resume.user == useruser.is_authenticated

條件用途適用場景
resume.user == user判定履歷是否屬於當前登入使用者。需進一步驗證所有權。用於敏感操作(如編輯或刪除)。
user.is_authenticated判定使用者是否已登入,僅關心登入狀態,與具體的內容所有權無關。用於通用功能(如顯示新增按鈕)。

小結

透過新增公開留言與履歷列表功能,我們成功擴展了系統的使用場景。具體改進包括:

  1. 新增公開留言頁面:允許訪客查看履歷及相關留言。
  2. 分層功能:區分登入用戶與訪客,提供不同的行為邏輯。
  3. 體驗優化:通過 HTMX 和 Alpine.js 改善互動性能。

希望本篇內容能幫助新手了解如何靈活應用 Django 架構,實現更豐富的功能!

Similar Posts

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *