Web Framework ที่ชื่อ Django สามารถสร้าง CRUD ได้ง่ายดาย รวดเร็ว เพียงแต่สร้าง Model ให้ถูกต้อง Django จะจัดการสร้างหน้า Interface ให้อย่างสวยงาม แทบจะไม่ต้องเขียนคำสั่งใด ๆ เลย หน้าของ interface ก็มีแบบ one to many ด้วย

ในตอนที่ 8 นี้จะได้นำเอา entity ทั้งหมดมาสร้างเป็น model ในไฟล์ที่ชื่อ models.py แนะนำให้กลับไปดู entity ของ northwind ว่ามี entity ใดบ้างที่ยังไม่ได้สร้าง ให้กลับไปอ่านในตอนที่ 3 หรือคลิกดูเฉพาะรูปภาพที่นี่ 

....

จาก entity ของ Nortwind ที่ได้สร้างไว้แล้วมี 3 entity ได้แก่ Categories, Porducts และ Suppliers ที่ยังไม่ได้สร้างใน model ประกอบด้วย employees, orders, customers, orderDetails สำหรับ shiper นั้นจะไม่ขอทำในตัวอย่างนี้นะครับ และฟิลด์บางฟิลด์ของ Northwind ใน Access กับที่ผมนำมาประยุกต์จะแตกต่างกันบ้างเพื่อความเหมาะสม แต่สาระสำคัญยังมีอยู่ครบ

.....

มาเริ่มสร้าง model กันต่อดีกว่า ด้วยการ

  • เปิดไฟล์ models.py แล้วพิมพ์คำสั่งต่อไปนี้ต่อท้ายบรรทัดสุดท้าย ระมัดระวังการจัดย่อหน้านะครับ ภาษาไพธอน สนใจการจัดย่อหน้า พอ ๆ กับ Case sensitive

 

class Customers(models.Model):

    CustName = models.CharField(max_length=50,verbose_name='ชื่อ')

    CustLName = models.CharField(max_length=70,verbose_name='นามสกุล')

    Address = models.CharField(max_length=100,verbose_name='บ้านเลขที่ ถนน ตำบล')

    District = models.CharField(max_length=100,verbose_name='อำเภอ')

    Province = models.CharField(max_length=100,verbose_name='จังหวัด')

    PostalCode = models.CharField(max_length=5,verbose_name='รหัสไปรษณีย์')

    Phone = models.CharField(max_length=12,blank=True,verbose_name='โทรศัพท์')

    Mobile = models.CharField(max_length=13,blank=True ,verbose_name='โทรศัพท์เคลื่อนที่')


    class Meta:

        verbose_name_plural = "ข้อมูลลูกค้า"

        verbose_name = "ข้อมูลลูกค้า"

        ordering = ['CustName']


    def __unicode__(self):

        return u"%s %s" % (self.CustName, self.CustLName)

 

 

class Employee(models.Model):

    Title = models.CharField(max_length=20,verbose_name='คำนำหน้าชื่อ')

    EmpName = models.CharField(max_length=50,verbose_name='ชื่อ')

    EmpLName = models.CharField(max_length=50,verbose_name='นามสกุล')

    Position = models.CharField(max_length=50,verbose_name='ตำแหน่ง')

    BirthDate = models.DateField(verbose_name='วันเดือนปีเกิด')

    HireDate = models.DateField(verbose_name='วันเดือนปีเริ่มงาน')

    Address = models.CharField(max_length=100,verbose_name='บ้านเลขที่ ถนน ตำบล')

    District = models.CharField(max_length=100,verbose_name='อำเภอ')

    Province = models.CharField(max_length=100,verbose_name='จังหวัด')

    PostalCode = models.CharField(max_length=5,verbose_name='รหัสไปรษณีย์')

    Phone = models.CharField(max_length=12,blank=True,verbose_name='โทรศัพท์')

    Mobile = models.CharField(max_length=13,blank=True ,verbose_name='โทรศัพท์เคลื่อนที่')

    Photo = models.ImageField(verbose_name='ภาพถ่าย', upload_to='photos/%Y/%m/%d')


    class Meta:

        verbose_name_plural = "ข้อมูลพนักงาน"

        verbose_name = "ข้อมูลพนักงาน"

        ordering = ['EmpName']


    def __unicode__(self):

        return u"%s%s  %s" % (self.Title, self.EmpName, self.EmpLName)



class Orders(models.Model):

    OrderID = models.AutoField(primary_key=True,verbose_name='รหัส')

    OrderDate = models.DateField(verbose_name='วันที่สั่งซื้อ')

    Customer = models.ForeignKey(Customers,verbose_name='ชื่อลูกค้า')

    Employee = models.ForeignKey(Employee,verbose_name='พนักงานขาย')


    class Meta:

        verbose_name_plural = "ข้อมูลการสั่งซื้อ"

        verbose_name = "ข้อมูลการสั่งซื้อ"

        ordering = ['OrderDate']


    def __unicode__(self):

        return u"%s %s" % (self.OrderID, self.Customer)


class OrderDetails(models.Model):

    OrderID = models.ForeignKey(Orders,verbose_name='รหัสสั่งซื้อ-ชื่อลูกค้า')

    ProdID = models.ForeignKey(Products,verbose_name='รหัสสินค้า-ชื่อสินค้า')

    Price = models.DecimalField(max_digits=10,decimal_places=2,verbose_name='ราคาต่อหน่วย')

    qty = models.DecimalField(max_digits=10,decimal_places=2,verbose_name='จำนวน')

    discount = models.DecimalField(max_digits=5,decimal_places=2,verbose_name='ส่วนลด')


    class Meta:

        verbose_name_plural = "ข้อมูลการซื้อ"

        verbose_name = "ข้อมูลการซื้อ"

        ordering = ['id']


    def __unicode__(self):

        return u"%s %s %s" % (self.id, self.OrderID,self.ProdID)

 

 

  • File > Save
  • c:\repository\django\bin\bmis >manage.py syncdb 
  •  ถ้าเครื่องของใครมันเตือนเรื่อง imageFields ก็เพราะว่ายังไม่ได้ติดตั้ง Python Image Library เพราะฉะนั้นให้ไปติดตั้งตามคำแนะนำในตอน การติดตั้ง PIL

...

ขั้นตอนต่อไปเป็นการ register โมเดลที่สร้างขึ้นใหม่ให้หน้าอินเทอร์เฟสของ admin รู้จักทุก ๆ entity  ซึ่งมีขั้นตอน ดังนี้

  • เปิดไฟล์ admin.py ซึ่งมีคำสั่งเดิมอยู่ 5 บรรทัด
  • ให้เพิ่ม entity ที่เพิ่มขึ้นมาใหม่จำนวน 3 entity ด้วยคำสั่งคล้าย ๆ กับของเก่า ดีงนี้

admin.site.register(Employee)

admin.site.register(Orders)

admin.site.register(OrderDetails)

admin.site.register(Customers)

 

  • File > Save
  • c:\repository\django\bin\bmis >manage.py runserver

...

ทดลองการทำงานด้วยการเปิด Browser และไปที่ localhost:8000/admin/

  • login เข้าสู่ระบบ
  • คลิกที่ เพิ่ม ข้อมูลพนักงาน จะได้ฟอร์มที่มีหน้าตาแบบนี้ครับ

 

 

 

...

สรุป จะเห็นว่าหน้าตาของฟอร์มต่าง ๆ จะมีลักษณะเป็นไปตามชนิดของฟิลด์ ที่เรากำหนด เช่น วันเดือนปีเกิด เราใช้ DateField() ดังนั้น หน้าตาของฟอร์มมันจะสร้างปฏิทินให้ผู้ใช้คลิก เพื่อเลือกป้อนวันที่ ซึ่งในภาษาจาวาสคริปต์เขาเรียกแบบนี้ว่า datepicker และที่โดดเด่นกว่านี้ ถ้าในกรณีที่ไม่ต้องการให้ผู้ใช้ป้อนเลยจะใช้ option เพิ่มเติมเป็น

auto_now_add=True

หรือ กำหนดค่าเริ่มเติ่มให้กับวันที่ เป็นวันนี้ ใช้คำสั่ง 

auto_now=True

 

วันนี้ขอแนะนำเพียงเท่านี้ก่อน ในครั้งหน้าจะมาปรับแต่งฟอร์มให้มีหน้าตาคล้ายกับ Northwind ครับ

 

----