Django 101 : บทที่ 2 การจัดการภายใน URLs , Views , Template และ Model

Django 101 : บทที่ 2  การจัดการภายใน Views

อย่างที่บอกคือ เมื่อเรา เข้า URL มันจะทำงานดังนี้ 

 URL>> View >> Model >> Template 
urls.py เปรียบเสมือนแผนที่ เพราะมันเป็นไฟล์ที่มีข้อมูลในการจับคู่ urls = views ที่อยู่ใน sub folder ของโปรเจ็ค และ app
views.py ไฟล์ ที่่รวม ฟังก์ชั่นทั้งหมด  (อยู่ใน sub folder app) ถือว่า เป็นตัวจัดการการตาม request ที่เข้ามา
model.py ไฟล์ที่ใช้เชื่อมต่อ database (อยู่ใน sub folder app)
template โฟลเดอร์ที่เก็บ html  (เป็น Folder ที่อยู่ใน sub folder app)

นั่นคือ เมื่อ มันได้รับค่า URLs มาแล้ว มันจะไปจับคู่กับ Views ซึ่ง Views คือ Function ทั้งหมดในการจัดการเวปไซต์ เพื่อไปดึงข้อมูล Model และไปแสดงผลผ่าน Template 

เริ่มต้นเราจะดู ภายใน ไฟล์  urls.py ว่า มีอะไรอยู่ภายใน

URLs
Code เริ่มต้น จะประมาณนี้ โดยเป็นการจับคู่ ระหว่าง urls/ members ไปเรียกไฟล์ views.members(ฟังก์ชั่นชื่อ members เช่นกัน พร้อมกับส่งค่า name = "member" ด้วย) 

from django.urls import path

from . import views # ใช้จุด . เพราะอยู่ใน Folder เดียวกับ View.py 

urlpatterns = [

    path('members/', views.members, name='members'),
    path('<str:food_id>' , views.food, name = 'aaa') 
     # เป็นการรับค่าจาก urls ไปส่งต่อให้ view ได้ โดยต้องมี ทั้งลักษณะข้อมูลและตัวแปร

]

อธิบาย Code ดังนี้ คือ ถ้าเข้า โฟลเดอร์ members จะไปเรียกไฟล์ views ด้วยฟังก์ชั่นชื่อ members  

ถึงตรงนี้ หลายคนจะสงสัยว่า ไฟล์  urls.py ควรอยู่ที่ไหน  จำได้รึเปล่าครับ ว่า เราสร้าง โปรเจค ชื่อ  my_tennis_club โดยมีโฟลเดอร์หลักในชื่อเดียวกัน และมี Sub Folder ชื่อ เดียวกัน 

และเราได้สร้าง App ที่ชื่อ name ทำให้มี sub folder ชื่อ name ด้วย  

ถึงคราวนี้เราจะสร้าง App ชื่อ Name แต่สำหรับไฟล์ url.py ต้องอยู่ใน sub folder ของโปรเจ็คชื่อ my_tennis_club  

โดยในโปรเจค my_tennis_club นี้ เราอาจเขียนไฟล์ urls.py เราจะเขียนไว้ดังนี้

from django.contrib import admin

from django.urls import include, path

urlpatterns = [

    path('', include('members.urls')),

    path('admin/', admin.site.urls),

]


อย่างไรก็ดี เราจะเรียนรู้การเขียนรายละเอียดต่างๆ ในภายหลังอีกครั้ง  (แต่โค๊ดนี้ จะประมาณว่า ถ้า Path ว่าง จะไปเรียก member.urls  และถ้าเข้า path ชื่อ admin จะไปเรียกไฟล์ admin.site.urls

** ไฟล์ urls.py ต้องแก้ไขทั้ง 2 ไฟล์ คือ Project และ app เลย

View

หน้าที่หลักของมันคือ การแสดงผล (ผ่านฟังก์ชั่น) คราวนี้เราจะมาดู ภายในไฟล์ view.py    มันจะเริ่มต้นด้วย Code พื้นฐานนี้ (เป็น code Python) 

from django.shortcuts import render

from django.http import HttpResponse

def members(request):

    return HttpResponse("Hello world!")


ถึงตรงนี้ เราก็ใช้คำสั่ง run server อีกครั้ง

py manage.py runserver

หลังจากนั้น ใช้ Browser เข้าที่ 127.0.0.1:8000/members/

ก็จะเห็นเป็น hello world 

Template 
มาถึงตรงนี้จะต่างกับ ส่วนอื่น เพราะมันเป็น Folder ที่ใช้เก็บไฟล์ html  โดยมันจะอยู่ภายใต้ Sub Folder ของ App ที่ชื่อ members อีกที

** สามารถสร้าง html ได้หลายอัน แต่ มันต้องไปสร้าง view มาเชื่อม
** ต้องการให้แสดงผลเป็น เดือนปี เป็นภาษาไทย ต้องไปเปลี่ยนที่ setting.py ของโปรเจค time zone เป็น 'Asia/bangkok' และ langauge code เป็น 'th'

my_tennis_club

    manage.py

    my_tennis_club/

    members/

        templates/

            myfirst.html

โดย ไฟล์ myfirst.html จะเริ่มต้นง่ายๆ (ยังเป็น html แบบ Static ธรรมดา) ประมาณนี้

<!DOCTYPE html>

<html>

<body>

<h1>Hello World!</h1>

<p>Welcome to my first Django project!</p>
<p> id {{food_id}}</p>
# เครื่องหมาย {{ }} หรือเรียกเครื่องหมายวาร์ป คือการใส่ตัวแปร โดยใน view จะใช้ คำสั่ง
           return render(request ,"html" ,context ={ 'ตัวแปรใน html', ตัวแปรที่รับจาก url})
<p>{% คำสั่ง%}</p>
# เครื่องหมาย {% คำสั่ง%} คือเราจะใส่คำสั่งอะไรลงไปก็ได้  ยกตัวอย่างเช่น  {% url  "name ใน urls.py"%} ก็จะลิ้งค์ไปหน้าดังกล่าวได้เลย
</body>

</html>


คราวนี้เรากลับไปแก้ไขไฟล์ view.py ในโปรเจ็คเราอีกครั้ง

from django.http import HttpResponse

from django.template import loader


def members(request):

  template = loader.get_template('myfirst.html')

  return HttpResponse(template.render())


ซึ่งมันเป็นคำสั่งง่ายๆ  คำอธิบายคือ ให้ template นั้น ดึง html ชื่อ Myfirst.html
แล้ว คืนค่า ด้วยคำสั่ง template.render() 


เทคนิก ในการแบ่งเป็น Header และ Footer (Layout)
เราจะสร้าง folder ชื่อ component  ไว้ที่ app หลักก่อน  แล้วสร้าง header.html กับ footer.html
แล้วเราก็ใช้ tag {% include %}

แต่ยังมี เทกนิคที่ง่ายกว่า แต่ซับซ้อนกว่า คือการสร้าง File Base  มันจะเป็นไฟล์ html เช่นกัน แต่มันจะเป็น โครง 
{% include 'header.html' %}
{% block ชื่อบล็อก %}{% end block %}
{% include 'footer.html' %}

ไฟล์ html หลักจะเรียกใช้ด้วยคำสั่ง
{% extend "File Base.html" %}
{% block ชื่อที่อยู่ใน base.html %}

เนื้อหา 
{% end block %}

Model

สุดท้ายที่เราจะเรียนรู้ คือ การเชื่อมต่อฐานข้อมูล กับ View  ผ่าน Model ( Model เชื่อมต่อกับ Database ได้แค่ 1 อันเท่านั้น)

อย่างไรก็ดี Django จะเชื่อมต่อ Database ด้วย Django ORM (Object Relational Mapper) เท่านั้น

ยกตัวอย่าง กรณี เราเชื่อมต่อกับ SQLite  เราจะต้องมีไฟล์ ชื่อ  db.sqlite3 วางไว้ที่ sub folder ของโปรเจค

ถึงตรงนี้เราเรียน Views ที่จะดึงข้อมูลก่อน 

all_aa = [{ 'id' : 1, 'title' : aa}
{ 'id' : 2, 'title' : bb}
]
def aaa(request )
     context= {'all':all_aa}
     return render(request ,"html",context)
เทคนิการกรอง
def  bbb(request , id_aa )
    one = [f for f  in all_aa if f['id' ] = id_aa][0]
     context = 
{'all':one}
     return render(request ,"html",context)

  ส่วน html

<% for all in alls%>
{{all.title| floatformat:'g' }} # เป็นการใส่ filter ให้ออกมาเป็น คอมม่าคั่นหลักพัน
<%if %>
<%endif %>
<% endfor %>

ไฟล์ models.py  พื้นฐานจะมีคำสั่งดังนี้

การสร้าง Table (Database)

from django.db import models

class Member(models.Model):

  firstname = models.CharField(max_length=255)

  lastname = models.CharField(max_length=255)

คำสั่งนี้จะเป็นการสร้าง Table ชื่อ Members โดยฟิลด์ชื่อ firstname กำหนดให้มีค่าสูงสุด 255 ตัวอักษร และ lastname

ถึงตรงนี้เมื่อสร้างไฟล์ models.py ไว้เรียบร้อยแล้ว เราจะต้องใช้คำสั่ง (ทุกครั้งที่มีการ สร้าง/ แก้ไข Model เนื่องจาก มันจะไปสร้าง Scripts พิเศษขึ้นมาอีกที)
py manage.py makemigrations members

ผลที่ได้มันจะแจ้งว่า มีการ Create model ชื่อ member เรียบร้อยแล้ว

 Migrations for 'members':

  members\migrations\0001_initial.py

    - Create model Member


(myworld) C:\Users\Your Name\myworld\my_tennis_club>

โดยมันจะสร้างไฟล์ Scripts ไว้ชื่อ  00001_innitial.py ไว้ที่โฟลเดอร์ migrations
my_tennis_club/members/migrations/0001_initial.py:




ความคิดเห็น

โพสต์ยอดนิยมจากบล็อกนี้

KoolMocyc : Forza 350 สเปกต่างๆ และการแก้ไข

Stable Diffusion 101 : Extension : AnimateDiff

KoolMocyc : Forza 350 : ปัญหาประจำตัว