Django Forms ผู้ช่วยที่ทำให้การสร้าง Forms เป็นเรื่องง่าย Ep. 2 Model forms

Model forms สร้าง form ตาม Model ได้แบบรวดเร็ว

stackpython
3 min readAug 13, 2020

Django Forms: Model Forms

Model Forms เป็นตัวที่ทำให้เราสร้าง Forms ได้ง่ายขึ้นมากในแต่ละ Model ก็จะมี Field ที่ต้องใส่เพื่อเพิ่มข้อมูลเข้าไปใน Database ซึ่งเราสามารถที่จะอ้างอิง Field ที่ Model ต้องการเพื่อนำไปสร้าง Form ได้ซึ่งใน Form ก็จะมี Field ตามที่เราสร้างใน Model เลยโดยที่เราไม่ต้องไปสร้าง Form เพิ่มแยกขึ้นมากริ่นมาพอควรแล้วเรามาลองสร้าง Model เพื่อที่จะเอาไปทำ Form กันเลยดีกว่าครับ

Create Model

เราสร้าง Model ที่เป็น Order และ Water เพื่อเก็บข้อมูลที่ลูกค้าสั่งและน้ำหวานที่ให้ลูกค้าสามารถสั่งได้โดยเราไปที่ models.py ที่อยู่ใน order folder แล้วเขียนโค้ดตามนี้

models.py in order folder

เราได้สร้าง model ขึ้นมาแล้วในที่นี้มีอยู่ 2 model คือ Water และ Order ในส่วนของ Water เราได้เก็บข้อมูล water ซึ่งเป็นน้ำหวานในร้านน้ำแข็งใสเก็บประเภทเป็น char และมีการแปลง object ให้เป็น string เพื่อให้ง่ายต่อการนำไปใช้โดยใช้ function __str__
Order model เก็บข้อมูลที่ลูกค้าสั่งโดยจะเก็บ topping ต่างๆที่ลูกค้าเพิ่มเข้ามาสามารถใส่ได้ 2 topping และมีการดึงตารางของ Water มาใช้โดยอ้าง Foreign Key ไปหา Water Model

Make Migrations

เพื่อทำให้ model ขึ้นไปอยู่ใน database เราจำเป็นต้องมีการ migrate เป็นขึ้นตอนที่ทำให้เราเอา model ของเราเปลี่ยนกลายไปเป็นตารางขึ้นไปอยู่ใน database ซึ่งสิ่งนี้เราเรียกกันว่า Django ORM ซึ่งถ้าใครอยากอ่านเจาะลึกเข้าไปอีกว่าทำงานอย่างไหร่ก็สามารถที่จะหาอ่านเพิ่มเติมได้นะครับวันนี้ผมขอแค่บอกวิธีการที่ทำให้ model เราขึ้นไปอยู่ใน database ขั้นตอนแรกคือการ makemigration

python manage.py makemigrations

Migrations for ‘order’:
order\migrations\0001_initial.py
— Create model Water
— Create model Order

ขั้นตอนที่สองคือ migrate

python manage.py migrateOperations to perform:
Apply all migrations: admin, auth, contenttypes, order, sessions
Running migrations:
Applying contenttypes.0001_initial... OK
Applying auth.0001_initial... OK
Applying admin.0001_initial... OK
Applying admin.0002_logentry_remove_auto_add... OK
Applying admin.0003_logentry_add_action_flag_choices... OK
Applying contenttypes.0002_remove_content_type_name... OK
Applying auth.0002_alter_permission_name_max_length... OK
Applying auth.0003_alter_user_email_max_length... OK
Applying auth.0004_alter_user_username_opts... OK
Applying auth.0005_alter_user_last_login_null... OK
Applying auth.0006_require_contenttypes_0002... OK
Applying auth.0007_alter_validators_add_error_messages... OK
Applying auth.0008_alter_user_username_max_length... OK
Applying auth.0009_alter_user_last_name_max_length... OK
Applying auth.0010_alter_group_name_max_length... OK
Applying auth.0011_update_proxy_permissions... OK
Applying auth.0012_alter_user_first_name_max_length... OK
Applying order.0001_initial... OK
Applying sessions.0001_initial... OK

จะเห็นว่าทำไมมันมี model อื่นที่ถูก migrate ขึ้นไปด้วยเยอะเลย เพราะว่าในส่วนของ django ได้ทำ model พื้นฐานไว้อยู่ด้วยครับถ้าเราสั่งคำสั่ง migrate model พื้นฐานก็ถูกนำขึ้นไปยัง database ด้วยซึ่งมันจะเป็น model เกี่ยวกับ auth และ admin เป็นตัวช่วยให้เราทำระบบ user ได้ง่ายขึ้นโดยที่เราไม่ต้องสร้างเองดึงสิ่งที่ django สร้างมาให้เอามาใช้แค่นั้นสะดวกไปอีก ในบทความนี้ผมขอไม่ลงลึกเกี่ยวกับเรื่องนี้มากนะครับ

แค่นี้ model เราก็เปลี่ยนไปเป็นตารางที่อยู่ใน database แล้วครับซึ่งในตอนนี้ database ของเราจะเป็นตัว sqlite ถ้าต้องการที่จะดู database โดยตรงก็สามารถโหลด DB Browser มาดู database ของเราได้แต่ในบทความนี้ผมอยากให้ทุกคนดูผ่าน admin panel ที่ทาง django ได้สร้างขึ้นมาให้เราสามารถเข้าไปดูข้อมูล เพิ่มข้อมูล แก้ไขข้อมูล และลบข้อมูลผ่านทาง admin panel ได้เลยสะดวกมาก ๆ ก่อนที่เราจะเข้าไปใช้ admin panel ได้เราต้องมี user ก่อน ซึ่งก็แค่สร้างขึ้นมาโดยพิมคำสั่งตามนี้

python manage.py createsuperuser

โดยจะมีให้เราใส่ username และ password เพื่อเป็นการสร้าง user แค่นี้ก็สามารถสร้าง superuser ได้แล้วซึ่งเราสามารถเอารหัสนี้ไปใช้ใน admin panel ได้เลยที่นี้เรามา run server กันดีกว่า

python manage.py runserver

ใส่ username และ password เพื่อเข้าสู่ระบบได้เลย

admin panel

เราสามารถเข้าสู่ระบบ admin ได้แล้วแต่มันยังไม่ได้แสดง database ที่เราได้ migrate ขึ้นไปเลยสักอันเดี่ยว เพราะว่าเรายังไม่ได้เพิ่มลงไปให้มันแสดงเพราะฉะนั้นเราก็ไปที่ admin.py ที่อยู่ใน order folder เพื่อเพิ่มโค้ดที่ทำให้แสดงข้อมูลตารางของเราที่เราได้สร้างขึ้น

เพิ่มแค่นี้เองครับก็สามารถมองเห็นตารางที่เราสร้างมาได้แล้วครับลองเข้าไปที่หน้า admin panel กันใหม่ http://127.0.0.1:8000/admin/

admin panel

ถัดมาเรามาเพิ่มข้อมูลให้ Waters เราดีกว่าครับเพื่อจะได้มีน้ำให้ลูกค้าเราเลือกหลายๆน้ำเราสามารถที่จะเพื่มน้ำเข้าไปใน admin panel ได้เลยครับโดยกดไปที่ add

add water

แล้วกด save ได้เลยจากนั้นน้ำที่เราเพิ่มไปจะถูกบันทึกลงใน database ซึ่งผมได้เพิ่มไป 4 น้ำ

waters

Create Modal forms

เริ่มสร้าง Modal Forms กันเลยดีกว่าครับเริ่มจากไปที่ไฟล์ forms.py และเรียก modal จาก modals.py มาใช้เป็น form

เราจะทำการแก้ไข OrderForm ให้เป็นการเรียกใช้ model และดึง field ที่อยู่ใน model มาแสดงผลเอาล่ะรันเซิฟดูผลลัพท์กันดีกว่าครับ

python manage.py runserver

ไปที่ http://127.0.0.1:8000/order

เราจะเห็นว่ามี form ขึ้นมาเหมือนเดิมกับที่เราสร้างเมื่อบทความที่แล้วเลยแตกต่างที่ label ซึ่งตัวโค้ดน้อยกว่ากันมากและยังอิงตามตารางที่เราได้สร้างไว้ได้ถูกต้องอีกด้วยสำหรับการใช้ model form ช่วยลดเวลาของเรามากๆเลยครับในการที่เราจะสร้าง form ที่ต้องอิงกับตารางใน database แต่ละครั้งอาจจะต้องเสียเวลาและมีจำนวนบรรทัดเยอะแต่ตัวนี้เพิ่มไม่กี่บรรทัดก็สามารถได้ form แล้วครับ

Add Order to Database

เมื่อเราทำ order form เสร็จแล้วต้องการที่จะเอาข้อมูลนี้เพิ่มเข้าไปใน database ก็ต้องไปเพิ่ม code ในส่วนของ views.py ตามนี้เลย

แล้วก็ลองกรอกข้อมูลแล้วกดส่ง

ไปดูข้อมูลในหน้า admin ว่าข้อมูลที่เรากดสั่งไปมันเข้ามาอยู่ใน Database ยังให้ไปดูที่ http://127.0.0.1:8000/admin/ แล้วไปที่ตาราง order

ถ้ากดเข้าไปดูจะเห็นรายระเอียดตรงตามที่เราสั่งเลย

ง่ายใช่ไหมครับสำหรับ model form และการเพิ่มข้อมูลเข้าไปยัง database ในส่วนของ ep นี้ก็ขอจบเพียงเท่านี้ครับขอบคุณทุกคนที่อ่านจนจบ ถ้าชอบก็ตบมือและติดตามเป็นกำลังใจให้กันด้วยนะครับถ้ามีตรงไหนสงสัยหรืออยากเสนอความคิดเห็นสามารถ comment มาเพื่อพูดคุยกันได้นะครับ สำหรับบทความต่อไปเราจะพูดกันถึงเรื่องการจัดการ form ให้มีระเบียนและสวยงามมากกว่าที่เป็นอยู่นี้รอติดตามกันได้ครับ

สามารถติดตามพวกเราได้ที่
Facebook: Stackpython
Youtube: Stackpython

--

--