抱歉,您的瀏覽器無法訪問本站
本頁面需要瀏覽器支持(啟用)JavaScript
了解詳情 >

在 Django 中,Form (表單) 是處理使用者輸入資料的關鍵元件。無論是註冊、登入、留言、商品建立等功能,都會涉及表單的建立、顯示與驗證。

1. 為什麼要使用 Django Form?

  • 自動產生表單欄位與 HTML
  • 內建資料驗證 (驗空、格式檢查等)
  • 支援自訂驗證邏輯與錯誤訊息
  • 與 Model 整合,快速產生資料模型表單

2. 基本 Form 類型

自訂 Form 類別 (純手工表單)

1
2
3
4
5
6
7
# forms.py
from django import forms

class ContactForm(forms.Form):
name = forms.CharField(max_length=50)
email = forms.EmailField()
message = forms.CharField(widget=forms.Textarea)

顯示於 HTML:

1
2
3
4
5
<form method="post">
{% csrf_token %}
{{ form.as_p }}
<button type="submit">送出</button>
</form>

3. 處理 POST 請求與驗證

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# views.py
from django.shortcuts import render
from .forms import ContactForm

def contact_view(request):
if request.method == 'POST':
form = ContactForm(request.POST)
if form.is_valid():
# 可從 form.cleaned_data 取得表單資料
name = form.cleaned_data['name']
return render(request, 'thanks.html', {'name': name})
else:
form = ContactForm()
return render(request, 'contact.html', {'form': form})

4. 表單呈現方法

呈現方式 說明
form.as_p 每個欄位包在 <p> 標籤中
form.as_table 每個欄位以 <tr> 呈現
form.as_ul 每個欄位以 <li> 呈現
手動渲染 個別使用 {{ form.field }} 控制格式

5. 使用 ModelForm (與 Model 結合)

若要直接與資料庫模型對應,可使用 ModelForm

1
2
3
4
5
6
# models.py
from django.db import models

class Article(models.Model):
title = models.CharField(max_length=100)
content = models.TextField()
1
2
3
4
5
6
7
8
# forms.py
from django import forms
from .models import Article

class ArticleForm(forms.ModelForm):
class Meta:
model = Article
fields = ['title', 'content']
1
2
3
4
5
6
7
8
9
10
# views.py
def create_article(request):
if request.method == 'POST':
form = ArticleForm(request.POST)
if form.is_valid():
form.save()
return redirect('article_list')
else:
form = ArticleForm()
return render(request, 'article_form.html', {'form': form})

6. 自訂欄位與錯誤訊息

1
2
3
4
5
6
7
class ContactForm(forms.Form):
name = forms.CharField(
max_length=50,
required=True,
label="您的姓名",
error_messages={'required': '請輸入姓名'}
)

驗證欄位資料:

1
2
3
4
5
6
7
8
class ContactForm(forms.Form):
email = forms.EmailField()

def clean_email(self):
data = self.cleaned_data['email']
if not data.endswith('.com'):
raise forms.ValidationError("只接受 .com 結尾的信箱")
return data

7. 表單錯誤處理

1
2
3
4
5
6
7
8
9
{% if form.errors %}
<div class="alert alert-danger">
請修正下列錯誤:
{{ form.errors }}
</div>
{% endif %}

{{ form.name.errors }}
{{ form.name }}

8. 常用欄位型別總覽

欄位類型 對應 HTML 輸入類型
CharField <input type="text">
EmailField <input type="email">
BooleanField <input type="checkbox">
DateField <input type="date">
ChoiceField <select>
MultipleChoiceField <select multiple>
FileField / ImageField 上傳檔案 / 圖片欄位

9. 延伸功能與技巧

9.1 使用 widgets 自訂欄位外觀與 CSS

1
name = forms.CharField(widget=forms.TextInput(attrs={'class': 'form-control'}))

9.2 處理上傳檔案時,需使用 request.FILES

1
form = UploadForm(request.POST, request.FILES)

留言