จาก Chapter 5 นั้นหากเราต้องการจะแก้ไขข้อมูลใน Database เราต้องเข้าไปผ่าน shell ซึ่งยุ่งยากและต้องจำคำสั่งดังนั้นเพื่อให้ง่ายต่อการเพิ่ม ลบ แก้ไข ข้อมูลนั้นหน้า Admin จึงเกิดขึ้นในบทนี้จะกล่าวถึงการจัดการและการใช้หน้า Admin
1.ใน Django เวอร์ชั่น 1.6 นั้นหน้า admin ถูกเปิดไว้อยู่แล้วเป็นค่าพื้นฐานดังนั้นจึงไม่ต้องแก้ไขอะไรเพื่อให้สามารถใช้งานหน้า admin เลยทันทีดังนั้นพิมคำสั่ง python manage.py runserver เพื่อเปิด Server จากนั้น เข้าไปที่หน้า http://127.0.0.1:8000/admin/ ผ่าน Browser ของเรา
2.เมื่อเข้าไปแล้วจะเจอหน้าให้ Log in ให้เราใส่ Username และ Password ที่เราได้ตั้งไว้ต้องสร้าง Superuser ใน Chapter 5 ที่ผ่านมาแต่ถ้าหากใครที่ใน Chapter 5 ยังไม่ได้สร้าง Superuser นั้นให้พิมคำสั่ง python manage.py createsuperuser ใน Terminal เพื่อสร้าง Superuser แล้ว log in เข้าระบบ admin ไป
3.จะเห็นว่าเมื่อ Log in เข้าไปแล้วเราสามารถเข้าไปแก้ไขข้อมูลของ User เพิ่มลบ ได้ตามต้องการในหัวข้อ Users ทดลองเล่นได้ครับและยังมี History ให้เราดูอีกด้วยว่ามีการแก้ไขอะไรเกี่ยวกับ User ไหนไปบ้าง เมื่อวันไหนแก้ไขอะไร
4.ทำการเพิ่ม Models ของเราที่สร้างไว้ใน Chapter 5 มาใส่ใน admin เพื่อให้เราสามารถแก้ไขได้โดยเปิดไฟล์ books/admin.py แล้วแก้ไขดังนี้
การทำงานของ admin เบื้องต้นนั้นเมื่อเราเริ่ม runserver ตัว Django จะอ่านค่าจากใน Urls.py ซึ่งเมื่อเจอ admin.autodiscover() เป็นบรรทัดที่บอกให้ admin เริ่มทำงานดังนั้นก็จะไปอ่านค่าจากใน INSTALLED_APPS สำหรับ Setting ของ admin และจากนั้นจึงไปหาไฟล์ admin.py ซึ่งเมื่อเจอก็จะโหลดโค้ดภายในไฟล์ไปใส่ในเว็บ admin ด้วยดังนั้นเมื่อเราแก้ไขเพื่อเพิ่ม models ใน admin.py จึงทำให้เราเห็น models ทั้ง 3 มาโผล่อยู่ในเว็บ admin นั่นเอง
5.เพิ่มทางเลือกให้กับ Author ใน admin โดยปกตินั้นหากเราเข้าไปเพิ่ม Author ใน admin นั้นเราจำเป็นต้องกรอก ข้อมูลทั้งหมด 3 อย่างคือ First name, Last name, E-mail ซึ่ง E-mail นั้นบางคนก็ไม่ได้ระบุมาให้ในหนังสือ ซึ่งถ้าเราไม่ใส่ E-mail เราก็ Save ข้อมูลลงใน Database ไม่ได้ดังนั้นเพื่อให้เราไม่จำเป็นต้องใส่ E-mail ก็สามารถใส่ค่าแล้ว Save ลงใน Database ได้ให้เข้าไปแก้ models.py ใน books อีกครั้งจากเดิม Author เรามีหน้าตาประมาณนี้
6.จากข้อ 5 การใส่ blank=True สามารถใส่ได้ในทุกๆ Field เพื่อให้ Admin ไม่ต้องถูกบังคับว่าต้องใส่ค่าถึงจะเพิ่มข้อมูลได้แต่ก็มี Field บางแบบที่ใส่ไม่ได้เช่น DateField, TimeField,
DateTimeField, IntegerField, DecimalField, FloatField เป็นต้น ซึ่งเมื่อเราไม่ใส่ค่าลงใน Field ใดๆก็ตามหากเราปล่อยว่างไว้ Field เหล่านั้นจะถูกกำหนดค่าให้เป็น Empty String เองโดยอัตโนมัติ แต่ Field ในตัวอย่างเบื้องต้นนั้นไม่สามารถใส่ได้เพราะมี Data Type ที่ถูกระบุไว้อยู่แล้วเช่น IntegerField ถูกระบุว่าต้องใส่ int ไว้อยู่แล้วเมื่อใส่ Empty String เข้าจึงเกิด Error ขึ้น วิธีการแก้ก็คือนอกจากเราจะใส่ blank เข้าไปแล้วยังมีอีกตัวที่ต้องใส่เข้าไปด้วยคือ null เพื่อให้เมื่อไม่ใส่ค่าก็จะให้ตัวแปรนั้นเป็น null ไปโดยจะแก้ไขใน publication_date ของ Book ดังนี้
7.เมื่อเราเข้าไปเพิ่ม Book, Author, Publisher นั้นจะมีช่องให้กรอกข้อมูลต่างๆ ซึ่งชื่อที่ใช้ระบุว่าช่องที่กรอกคือข้อมูลของอะไรจะกำหนดมาให้โดยอัตโนมัติจากชื่อตัวแปรที่เราตั้งไว้ใน models.py แต่ถ้าหากเราต้องการตั้งเองโดยอิสระก็สามารถทำได้โดยการเพิ่ม verbose_name เข้าไปดังนี้
8.หากเรามีข้อมูลใน Database แล้วนั้นจะพบว่าการแสดงชื่อของข้อมูลนั้นจะแสดงตาม __unicode__ ที่เราเขียนไว้ใน models ดังนั้นเพื่อความสวยงามและให้ง่ายต่อการอ่านข้อมูล เราสามารถตั้งค่าได้เองโดยเพิ่ม Class เข้าไปใน admin.py และแก้ไขดังนี้
Read more ...
1.ใน Django เวอร์ชั่น 1.6 นั้นหน้า admin ถูกเปิดไว้อยู่แล้วเป็นค่าพื้นฐานดังนั้นจึงไม่ต้องแก้ไขอะไรเพื่อให้สามารถใช้งานหน้า admin เลยทันทีดังนั้นพิมคำสั่ง python manage.py runserver เพื่อเปิด Server จากนั้น เข้าไปที่หน้า http://127.0.0.1:8000/admin/ ผ่าน Browser ของเรา
2.เมื่อเข้าไปแล้วจะเจอหน้าให้ Log in ให้เราใส่ Username และ Password ที่เราได้ตั้งไว้ต้องสร้าง Superuser ใน Chapter 5 ที่ผ่านมาแต่ถ้าหากใครที่ใน Chapter 5 ยังไม่ได้สร้าง Superuser นั้นให้พิมคำสั่ง python manage.py createsuperuser ใน Terminal เพื่อสร้าง Superuser แล้ว log in เข้าระบบ admin ไป
ภาพตัวอย่างหน้า http://127.0.0.1:8000/admin/
ภาพตัวอย่างเมื่อ Log in เข้าไปแล้วด้วย Superuser
3.จะเห็นว่าเมื่อ Log in เข้าไปแล้วเราสามารถเข้าไปแก้ไขข้อมูลของ User เพิ่มลบ ได้ตามต้องการในหัวข้อ Users ทดลองเล่นได้ครับและยังมี History ให้เราดูอีกด้วยว่ามีการแก้ไขอะไรเกี่ยวกับ User ไหนไปบ้าง เมื่อวันไหนแก้ไขอะไร
4.ทำการเพิ่ม Models ของเราที่สร้างไว้ใน Chapter 5 มาใส่ใน admin เพื่อให้เราสามารถแก้ไขได้โดยเปิดไฟล์ books/admin.py แล้วแก้ไขดังนี้
from django.contrib import adminแล้วลองรีเฟรชหน้า admin ใหม่จะเห็น Class ใน models ของเราปรากฎอยู่ในหน้า admin แล้ว
from books.models import Publisher, Author, Book
admin.site.register(Publisher)
admin.site.register(Author)
admin.site.register(Book)
การทำงานของ admin เบื้องต้นนั้นเมื่อเราเริ่ม runserver ตัว Django จะอ่านค่าจากใน Urls.py ซึ่งเมื่อเจอ admin.autodiscover() เป็นบรรทัดที่บอกให้ admin เริ่มทำงานดังนั้นก็จะไปอ่านค่าจากใน INSTALLED_APPS สำหรับ Setting ของ admin และจากนั้นจึงไปหาไฟล์ admin.py ซึ่งเมื่อเจอก็จะโหลดโค้ดภายในไฟล์ไปใส่ในเว็บ admin ด้วยดังนั้นเมื่อเราแก้ไขเพื่อเพิ่ม models ใน admin.py จึงทำให้เราเห็น models ทั้ง 3 มาโผล่อยู่ในเว็บ admin นั่นเอง
5.เพิ่มทางเลือกให้กับ Author ใน admin โดยปกตินั้นหากเราเข้าไปเพิ่ม Author ใน admin นั้นเราจำเป็นต้องกรอก ข้อมูลทั้งหมด 3 อย่างคือ First name, Last name, E-mail ซึ่ง E-mail นั้นบางคนก็ไม่ได้ระบุมาให้ในหนังสือ ซึ่งถ้าเราไม่ใส่ E-mail เราก็ Save ข้อมูลลงใน Database ไม่ได้ดังนั้นเพื่อให้เราไม่จำเป็นต้องใส่ E-mail ก็สามารถใส่ค่าแล้ว Save ลงใน Database ได้ให้เข้าไปแก้ models.py ใน books อีกครั้งจากเดิม Author เรามีหน้าตาประมาณนี้
class Author(models.Model):ให้เราแก้ไขในส่วนของ email ให้เป็นดังนี้
first_name = models.CharField(max_length=30)
last_name = models.CharField(max_length=40)
email = models.EmailField()
class Author(models.Model):จากที่แก้ไปเมื่อสักครู่นั้นเป็นการบอกว่าหากจะสร้าง Object ของ Author นั้นในส่วนของ email นั้นหากไม่ใส่ค่ามาก็สามารถสร้าง Object ได้นั่นเอง
first_name = models.CharField(max_length=30)
last_name = models.CharField(max_length=40)
email = models.EmailField(blank=True)
6.จากข้อ 5 การใส่ blank=True สามารถใส่ได้ในทุกๆ Field เพื่อให้ Admin ไม่ต้องถูกบังคับว่าต้องใส่ค่าถึงจะเพิ่มข้อมูลได้แต่ก็มี Field บางแบบที่ใส่ไม่ได้เช่น DateField, TimeField,
DateTimeField, IntegerField, DecimalField, FloatField เป็นต้น ซึ่งเมื่อเราไม่ใส่ค่าลงใน Field ใดๆก็ตามหากเราปล่อยว่างไว้ Field เหล่านั้นจะถูกกำหนดค่าให้เป็น Empty String เองโดยอัตโนมัติ แต่ Field ในตัวอย่างเบื้องต้นนั้นไม่สามารถใส่ได้เพราะมี Data Type ที่ถูกระบุไว้อยู่แล้วเช่น IntegerField ถูกระบุว่าต้องใส่ int ไว้อยู่แล้วเมื่อใส่ Empty String เข้าจึงเกิด Error ขึ้น วิธีการแก้ก็คือนอกจากเราจะใส่ blank เข้าไปแล้วยังมีอีกตัวที่ต้องใส่เข้าไปด้วยคือ null เพื่อให้เมื่อไม่ใส่ค่าก็จะให้ตัวแปรนั้นเป็น null ไปโดยจะแก้ไขใน publication_date ของ Book ดังนี้
class Book(models.Model):โดยเมื่อแก้ไขเสร็จแล้วต้อง Update Table ใน Database ใหม่ด้วย
title = models.CharField(max_length=100)
authors = models.ManyToManyField(Author)
publisher = models.ForeignKey(Publisher)
publication_date = models.DateField(blank=True, null=True)
7.เมื่อเราเข้าไปเพิ่ม Book, Author, Publisher นั้นจะมีช่องให้กรอกข้อมูลต่างๆ ซึ่งชื่อที่ใช้ระบุว่าช่องที่กรอกคือข้อมูลของอะไรจะกำหนดมาให้โดยอัตโนมัติจากชื่อตัวแปรที่เราตั้งไว้ใน models.py แต่ถ้าหากเราต้องการตั้งเองโดยอิสระก็สามารถทำได้โดยการเพิ่ม verbose_name เข้าไปดังนี้
class Author(models.Model):
first_name = models.CharField(max_length=30)
last_name = models.CharField(max_length=40)
email = models.EmailField(blank=True, verbose_name='e-mail')
ภาพตัวอย่างก่อนเพิ่ม verbose_name
ภาพตัวอย่างหลังเพิ่ม verbose_name
8.หากเรามีข้อมูลใน Database แล้วนั้นจะพบว่าการแสดงชื่อของข้อมูลนั้นจะแสดงตาม __unicode__ ที่เราเขียนไว้ใน models ดังนั้นเพื่อความสวยงามและให้ง่ายต่อการอ่านข้อมูล เราสามารถตั้งค่าได้เองโดยเพิ่ม Class เข้าไปใน admin.py และแก้ไขดังนี้
from django.contrib import adminโดย list_display เป็นการแบ่งช่องข้อมูลที่จะแสดงออกมาตามลำดับใน tuple นั้นจากตัวอย่าง first_name จะอยู่ซ้ายสุดตามด้วย last_name และ email ส่วน search_fields จะเป็นการเพิ่มช่อง search โดยข้อความที่พิมไปในช่องจะค้นหาจากข้อมูลที่ระบุไว้ใน tuple เท่านั้น list_filter คือการเพิ่ม filter เข้าไปในหน้าแอดมินช่วยให้สามารถ filter ข้อมูลได้ง่ายขึ้นโดยข้อมูลที่ใช้ในการ filter มาจาก publication_date ของ Book ทุกเล่ม date_hierarchy จะเพิ่มเมนูขึ้นมาให้กดเลือกซึ่งเป็น filter อีกเช่นกันแต่จะเป็น filter จากวันที่เท่านั้น ordering จะเป็นการกำหนดการเรียงลำดับข้อมูลที่แสดงผลมาให้ทันทีโดยในตัวอย่างจะเรียงจากวันที่เก่ากว่าขึ้นก่อน
from books.models import Publisher, Author, Book
class AuthorAdmin(admin.ModelAdmin):
list_display = ('first_name', 'last_name', 'email')
search_fields = ('first_name', 'last_name')
class BookAdmin(admin.ModelAdmin):
list_display = ('title', 'publisher', 'publication_date')
list_filter = ('publication_date',)
date_hierarchy = 'publication_date'
ordering = ('-publication_date',)
admin.site.register(Publisher)
admin.site.register(Author, AuthorAdmin)
admin.site.register(Book, BookAdmin)
ภาพตัวอย่างหน้า admin ของ Author
ภาพตัวอย่างหน้า admin ของ Book
9.นอกจากเราจะสามารถจัดรูปแบบการแสดงผลในหน้า admin ได้เองแล้วเรายังสามารถจัดรูปแบบตอนแก้ไขข้อมูลหรือเพิ่มข้อมูลได้อีกด้วยเข้าไปแก้ในไฟล์ admin.py ดังนี้
class BookAdmin(admin.ModelAdmin):
list_display = (’title’, ’publisher’, ’publication_date’)
list_filter = (’publication_date’,)
date_hierarchy = ’publication_date’
ordering = (’-publication_date’,)
filter_horizontal = (’authors’,)
raw_id_fields = (’publisher’,)
โดย filter_horizontal เป็นการเปลี่ยนรูปแบบการเลือกให้กลายเป็นหน้าต่าง 2 ฝั่งเป็นฝั่งที่เลือกกับไม่ได้เลือก ซึ่งเดิมๆหากเราต้องการจะเลือก authors หลายๆคนต้องกด Control ค้างแล้วคลิ๊กเพิ่ม แต่ในแบบนี้เราแค่ดับเบิ้ลคลิ๊กชื่อ ก็จะถูกเลือกทันทีเพิ่มความสะดวกมากขึ้น ส่วน raw_id_fields เป็นการเปลี่ยนจากเดิมจะให้เราเลือกโดยใช้ชื่อเป็นตัวกำหนดแต่เมื่อกำหนดตัวนี้ขึ้นมานั้นจะใช้ id เป็นตัวเลือกแทนแต่เราก็สามารถกดดูชื่อเต็มๆได้เช่นเดิม
จาก Chapter 6 นั้นหน้า Admin นั้นมีประโยชน์ในการช่วยจัดการกับ Database ของเราผ่านหน้าเว็บซึ่งง่ายกว่าการพิมคำสั่งผ่าน Shell อย่างแน่นอนและนอกจากจะช่วยให้จัดการง่ายขึ้นเรายังสามารถปรับเปลี่ยนรูปแบบการแสดงผลหรือการแก้ไขข้อมูลได้ตามใจเราต้องการอีกด้วย