今天講表單重構
昨天講了form 的新增,是直接寫 html input 等等
django 有 forms.py 的功能,不過不是一定要做,但做了會比較好
可以寫一個 class 透過views.py 傳到前端會產生html
https://docs.djangoproject.com/en/2.0/topics/forms/
modelforms: 這個class是要用在model儲存
https://docs.djangoproject.com/en/2.0/topics/forms/modelforms/
用的好處是可以把驗證寫在forms.py,比較簡單了。不像以前要一個一個寫程式判斷
新增 forms.py
繼承modelForm
forms.CharField(): 依據 欄位的型態 還有其他型態
label: 顯示的字預設是欄位名
required: 必填
model = <model_name> 對應到哪個 model class (資料表)
fields = ('name', ) 顯示的欄位
fields types
https://docs.djangoproject.com/en/2.0/topics/forms/modelforms/#field-types
store/forms.py
from django import forms
from store.models import Category
class CategoryForm(forms.ModelForm):
name = forms.CharField(label='類別', required=True)
class Meta:
model = Category
fields = ('name', )
views.py 改成new class 傳到前端
<form>(): 建立空的表單
<form>(request.POST): 把 request.POST 前端傳過來的資料進行驗證
<form>.is_valid(): 回傳驗證結果 True or False
就可以直接save()
store/views.py
def categoryCreate(request):
if request.method == 'GET':
categoryForm = CategoryForm()
return render(request, 'store/categoryCreate.html', {'categoryForm':categoryForm})
elif request.method == 'POST':
categoryForm = CategoryForm(request.POST)
if not categoryForm.is_valid():
return render(request, 'store/categoryCreate.html', {'categoryForm':categoryForm})
categoryForm.save()
return redirect('/store/category/')
只寫 categoryform 就可以產生了
as_p 會把 每一個 label + input 再包一個 <p>
https://docs.djangoproject.com/en/2.0/topics/forms/#form-rendering-options
<form method="post" action="/store/categoryCreate/">
{% csrf_token %}
{{ categoryForm.as_p }}
<input type="submit" value="儲存">
</form>
這樣就完成了
用 forms.py 好處滿多的 但要多寫程式就是了 ,可以寫很多客製化驗證,或是儲存後要多做處理等等
templates 那邊多半都會寫客製化的顯示每個欄位位置不一定會一致
可以參考https://docs.djangoproject.com/en/2.0/topics/forms/#rendering-fields-manually
未來有機會再來寫