Sunday, September 26, 2010

Learning Django: Django Admin Site

นอกจากการสร้าง web page แล้ว ใน web site ส่วนใหญ่จำเป็นต้องสร้าง interface สำหรับ admin ด้วย ซึ่งด้วยทั่วไปแล้ว interface มักมีหน้าตาคล้ายๆ กัน ดังนั้น Django ได้มี module ส่วนนี้มาให้ อยู่ใน django.contrib package

Activating the Admin Interface

เริ่มจากการแก้ไข settings.py ดังต่อไปนี้
1. เพิ่ม django.contrib.admin ไปในตัวแปร INSTALLED_APPS
2. เช็คดูว่า INSTALLED_APPS มี app เหล่านี้อยู่ (ปกติมีมาให้แล้ว)
- django.contrib.auth
- django.contrib.contenttypes
- django.contrib.sessions
3. เช็คดูว่า MIDDLEWARE_CLASSES มี class เหล่านี้อยู่

    'django.middleware.common.CommonMiddleware'
    'django.contrib.sessions.middleware.SessionMiddleware'
    'django.contrib.auth.middleware.AuthenticationMiddleware'

หลังจากนั้น sync database (pythong manage.py syncdb) ในขั้นตอนนี้ ระบบจะถามถึง super user name และ password สำหรับ web site ให้ตั้งค่าไป


ขั้นต่อไปให้ทำการแก้ไข map ใน urls.py โดยการ uncomment บรรทัดเหล่านี้ออก


# from django.contrib import admin
# admin.autodiscover()

# (r'^admin/', include(admin.site.urls)),


เท่านี้เราก็จะได้ admin site ที่สามารถจัดการ user และข้อมูลต่างๆ (ลองเปิดดูด้วย http://127.0.0.1:8000/admin/)

ทีนี้เราจะเพิ่ม models ของเราเข้าไปใน admin site เพื่อให้สามารถ เพิ่ม, ลบ, แก้ไข database ได้ โดยทำตามขั้นตอนดังนี้
1. ใน folder app (ภายใน project folder ในที่นี้คือ mysite/books) สร้าง ไฟล์ชื่อ admin.py เนื้อหาดังต่อไปนี้

from django.contrib import admin
from mysite.books.models import Publisher, Author, Book
admin.site.register(Publisher)
admin.site.register(Author)
admin.site.register(Book)


About Model in Admin Site

การจัดการ models ใน Admin Site จากตัวอย่าง app books เราสามารถเพิ่ม, ลบ ข้อมูลได้ แต่อาจจะมีปัญหาจุกจิก เล็กน้อยเช่น การเพิ่ม record จะต้องเติมข้อมูลทุกช่องลงไป (เนื่องจากตอนสร้าง ไม่ได้กำหนดว่าสามารถ null ได้ เป็นต้น) ในส่วนนี้จะทำการสรุป วิธีการปรับแต่งข้อมูล เล็กๆ น้อยๆ เพื่อที่จะสามารถ edit database ได้ใน Admin Site

1. Make Fields Optional


class Author(models.Model):
    first_name = models.CharField(max_length=30)
    last_name = models.CharField(max_length=40)
    email = models.EmailField(blank=True)



class Book(models.Model):
    title = models.CharField(max_length=100)
    authors = models.ManyToManyField(Author)
    publisher = models.ForeignKey(Publisher)
    publication_date = models.DateField(blank=True, null=True)



2. Customizing Fields Labels กำหนดชื่อ field ให้สื่อความหมายมากขึ้น


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')


Model Admin Class

การแก้ไขการแสดงผล database ในส่วนที่กล่าวมานั้นเป็นการ แก้ไขที่ model level ถ้าจะแก้ไขที่ admin level เราสามารถใช้ ModelAdmin class มาช่วยกำหนดการแสดงผลได้

วิธีการใช้ ModelAdmin class ใน admin.py สามารถสรุปได้ดังนี้
1. สร้าง class โดย inherit มากจาก admin.ModelAdmin
2. กำหนด customization ที่ต้องการ
3. register model โดยมี class ใหม่นี้เป็น พารามิเตอร์


ลองดูตัวอย่างสิ่งที่เรา customize ใน admin.py

1.ปรับlist display สำหรับ author, book, publisher
2.เพิ่ม search bar สำหรับ author
3.เพิ่ม date filter ให้ book
4.เรียงลำดับ date สำหรับ book
5.กำหนดและเรียงลำดับของ field

from django.contrib import admin
from mysite.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',)
    ordering = ('-publication_date',)

    fields = ('title', 'authors', 'publisher')


admin.site.register(Publisher)
admin.site.register(Author, AuthorAdmin)
admin.site.register(Book, BookAdmin)

No comments:

Post a Comment