Django 新手指南:新增分類欄位的邏輯
更新日期: 2024 年 12 月 24 日
本文為 Django 分類功能系列教學,第 1 篇:
在 Django 應用中,為用戶創建或編輯內容時,經常需要處理與分類相關的下拉選單(如選擇服務的分類)。
本篇文章將說明如何在視圖、表單和模板中正確設置分類選項,並提供完整的處理流程,幫助新手輕鬆應對常見場景。
視圖邏輯
在創建服務(Service)時,需要以下處理:
- 傳遞分類資料至模板,以便生成下拉選單。
- 確保用戶提交的分類資料正確保存。
以下是視圖的範例:
from .models import Category
from .forms import ServiceForm
from django.shortcuts import render, redirect
from django.contrib.auth.decorators import login_required
@login_required
def create_service(request, id):
# 確認用戶是否有權限操作
if not has_permission(request, id):
return redirect("services:error_page")
# 獲取所有分類
categories = Category.objects.all()
# 處理表單提交
if request.method == "POST":
form = ServiceForm(request.POST, request.FILES)
if form.is_valid():
service = form.save(commit=False)
service.freelancer_user = request.user
service.save()
return redirect("services:freelancer_dashboard", id=id)
else:
form = ServiceForm()
return render(request, "services/create_service.html", {"form": form, "categories": categories})
說明
- 傳遞
categories
到模板:將所有分類資料傳遞給模板,以便生成分類下拉選單。 - 表單校驗與保存:在 POST 請求中處理用戶提交的數據,保存有效內容。
- 初始化空表單:對於非提交狀態(GET 請求),提供空表單顯示給用戶。
表單結構
以下是表單的處理範例,用於確保分類欄位正確顯示和提交。
from django import forms
from .models import Service
class ServiceForm(forms.ModelForm):
class Meta:
model = Service
fields = ['name', 'description', 'category', 'price']
說明
- 包含分類欄位:確保表單中的
fields
列表包含category
欄位,這樣分類欄位才能出現在表單中。
模板中的下拉選單
新建服務時,模板中的分類下拉選單應該提供所有分類供用戶選擇,並且預設「請選擇」選項為空。
以下是模板的範例:
<select
id="category"
name="category"
class="bg-white text-gray-800 border border-gray-300 rounded-md p-2 w-full"
>
<option value="" selected>請選擇</option>
{% for category in categories %}
<option value="{{ category.id }}">{{ category.name }}</option>
{% endfor %}
</select>
說明
- 預設「請選擇」:為空選項設置
selected
,避免表單初始化時誤選中第一個分類。 - 動態生成分類選項:透過模板語法
{% for category in categories %}
,迭代顯示分類列表。
六、總結
- 新建服務表單的處理:
- 傳遞分類至模板,生成分類選單。
- 預設「請選擇」選項為空白,避免誤選。
- 設置初始值:
- 透過表單的
initial
參數設置默認分類,讓用戶快速選擇。
- 透過表單的
透過這些步驟,您可以構建一個功能完善的分類選單,讓系統更加清晰易用!