iT邦幫忙

2018 iT 邦幫忙鐵人賽
DAY 11
0
Modern Web

使用 Django 開發網頁系統系列 第 11

[Day 11] 重構表單-forms.py

  • 分享至 

  • xImage
  •  

今天講表單重構

昨天講了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
未來有機會再來寫


上一篇
[Day 10] 新增資料
下一篇
[Day 12] 重構程式(route variable)
系列文
使用 Django 開發網頁系統30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言