วันพุธที่ 1 กุมภาพันธ์ พ.ศ. 2560

Django tutorial pt.3

        ใน tutorial 3 จะเป็นการอธิบายถึงการใช้ Templates ในการแสดงผลต่างๆ ซึ่งใน tutorial ก่อนๆเราจะใช้คำสั่ง HtttpResponse() ในการแสดงผล ซึ่งในการทำเช่นน้้นก็เหมาะสำหรับการแสดงผลเล็กๆน้อย แต่ถ้าหากเราต้องการที่จะแสดงผลที่มีรายละเอียดมากยิ่งขึ้นเราก็จะมี Templates มาช่วย ซึ่ง Template ก็คือแม่แบบในการแสดงผล ซึ่งสามารถเขียนให้อยู่ในรูป HTML ได้

        ส่วนแรก tutorial จะให้เราทำในส่วนของ view.py เพิ่มเพราะว่าในตอนแรกส่วนของ view.py นั้นจะยังไม่มีอะไร เราจึงจะต้องทำ function เพิ่มโดยจะมีหน้าตาดังนี้



        โดยแต่ละ function จะเป็นการแสดงผลที่แตกต่างกัน หลังจากที่สร้าง function เสร็จก็จะไปแก้ urls.py ในไฟล์ของ project เพื่อทำการ link หรือ เรียกใช้ function เหล่านี้



        จะเห็นได้ว่ามีการใช้ regex (regular expression) ในการเปรียบเทียบค่าที่เราใส่ใน url กับ regex ที่เราตั้งไว้ โดยจะมีรายละเอียดดังนี้



index ==> ถ้าหากไม่มีอะไรต่อท้าย url ของ localhost:8000/polls จะเรียกใช้ function index เพื่อแสดงหน้าคำถามของ project '^$' ^ เป็นการกำหนดจุดเริ่มต้น และ $ เป็นการกำหนดจุดสิ้นสุด ในกรณีนี้คือเปิดแล้วปิดเลย ทำให้แสดงว่าเป็นการเว้นว่าง




detail ==> ถ้าหากหลัง localhost:8000/polls ตามด้วยตัวเลข ID ของคำถาม จะเป็นการแสดงหน้า Detail อย่างเช่น localhost:8000/polls/1 จะเป็นการแสดงรายละเอียดของคำถามข้อที่ 1 
โดย '^(?P<question_id[0-9]+)/$' หมายถึง ?P<name> เป็นการส่งค่าไปให้กับ function ที่เรียก ในที่นี้คือมีการส่งค่า question_id ไปให้กับ function detail โดย [0-9]+ หมายถึงเป็นตัวเลขได้ตั้งแต่เลข 0-9 ส่วน + คือ สามารถใส่ได้ตั้งแต่เลข 1 หลักเป็นต้นไป



result ==> ถ้าหากหลัง localhost:8000/polls ตามด้วย /ID/results/ จะแสดงผลในหน้าของ result โดย  '^(?P<question_id[0-9]+)/results/$' ส่วนของด้านหน้าได้อธิบายไปแล้ว ที่เพิ่มเติมคือด้านหลัง ถ้าหากมีคำว่า results/ ก็จะเรียกใช้ function results 



vote ==> ถ้าหากหลัง localhost:8000/polls ตามด้วย /ID/vote/ จะแสดงหน้า vote ออกมา ส่วนของ regex ก็เหมือนเดิมเพียงเปลี่ยนจาก /results/ ไปตรวจจับ /vote/ แทน

        ต่อจากนั้นจะเป็นการทดลองใช้ template กับหน้าแสดงผลของ index หรือ หน้า list คำถามนั้นเอง เริ่มจากการแก้ไขไฟล์ views.py ใน function index 


         ซึ่งเราสามารถใช้ shortcut หรือ คำสั่งลัดได้ดังนี้


        จะเห็นได้ว่าไม่มีความจำเป็นในการ import HttpResponse อีกต่อไป แล้วก็ไม่ต้องวนลูป for เพียงแต่ใช้คำสั่ง render() ซึ่งจะเป็นการเรียกใช้หน้า template ชื่อ index.html แล้วส่งค่า context หรือในที่นี้คือ ค่า object ทั้งหมดของคำถามไปใช้ในการแสดงผล

        ในการสร้างไฟล์ template นั้นจะต้องมีโฟลเดอร์เฉพาะ โดยชื่อจะต้องเป็น "templates" แล้วในโฟลเดอร์นี้ก็ต้องมีอีกโฟลเดอร์คือ "apps_name" ( ชื่อ app ที่สร้าง ในที่นี้คือ polls) 



        ในไฟล์ detail.html จะเป็นตัว template ไว้เรียกใช้งานหน้าตาของไฟล์ด้านในจะเป็นดังนี้


           เป็นการเขียนด้วยภาษา html โดย มีการใช้เงื่อนไข if เช็คค่า latest_question_list ว่ามีคำถามหรือ เปล่า ถ้าหากมีก็ใช้ for loop ในการแสดงผล แต่ถ้าหากไม่มีจะขึ้น เออเร่อ "No polls....ble"โดยเมื่อมีการใช้คำสั่งอย่าง if for จะต้องใช้ {%__%} เพิ่มเข้าไปด้วย

        เมื่อมีการใช้คำสั่ง if for ฯลฯ จะต้องมีการ end ด้วยเพื่อเป็นการปิด 

       ตัวแปร latest_question_list จะเป็นตัวแปรที่ถูกส่งค่ามาโดยตัวแปร context ในส่วนก่อนหน้านี้ในไฟล์ views.py function index

Hardcoded URLs

<li><a href="/polls/{{ question.id }}/">{{ question.question_text }}</a></li>
        ในโค้ดด้านบนจะเห็นได้ว่าเป็นการใช้ path ในการ link ไปส่วนอื่นๆ ซึ่งมันคือ hardcoded ส่วนด้านล่างจะเป็นการใช้ ชื่อที่กำหนดให้ใน urls.py ของเราเป็นการเรียก อย่างเช่น ต้องการเรียกหน้า detail ก็สามารถใช้ชื่อ 'detail' ได้เลยมีประโยชน์ในเรื่องการแก้ไข urls ซึ่งเวลาแก้จะได้ไม่ต้องมานั่งแก้ในไฟล์ template แก้แค่ในไฟล์ urls.py ทีเดียวเลย

<li><a href="{% url 'detail' question.id %}">{{ question.question_text }}</a></li>
Namespacing URL names

        ในการทำงานจริงๆ 1 Project อาจจะมีหลาย app ทำให้อาจเกิดปัญหาการตั้งชื่อ url ซ้ำกันได้เราจึงต้องกำหนดชื่อให้กับ app ติดไปให้กับ urls เผื่อการเรียกใช้งานด้วย







ไม่มีความคิดเห็น:

แสดงความคิดเห็น