網頁

Django 學習手冊-如何建立專案(2) Tutorial Part 2


Django 學習手冊-如何建立專案(2)

Tutorial Part 2

此份說明將延續 Django 學習手冊-如何建立專案(1)

一.啟動管理端介面 admin site

預設Django admin是沒有啟動的,欲啟動Django admin必須做三件事

1.在 mysite/settings.py 中的 INSTALLED_APPS 中增加 "django.contrib.admin"

2.執行 python manage.py syncdb 以更新前項之設定

3.更新mysite/urls.py 中的某些註解符號,使其設定生效,如下圖所示



from django.conf.urls.defaults import *

# Uncomment the next two lines to enable the admin:
from django.contrib import admin
admin.autodiscover()

urlpatterns = patterns('',
    # Example:
    # (r'^mysite/', include('mysite.foo.urls')),

    # Uncomment the admin/doc line below and add 'django.contrib.admindocs'
    # to INSTALLED_APPS to enable admin documentation:
    # (r'^admin/doc/', include('django.contrib.admindocs.urls')),

    # Uncomment the next line to enable the admin:
    (r'^admin/', include(admin.site.urls)),
)

二.啟動管理端伺服器

1.至mysite目錄下執行 python manage.py runserver

2.開啟瀏覽器,輸入網址 http://127.0.0.1:8000/admin 後,將會看到下列畫面

Django admin login screen
登入系統後你將會看到管理端的相關設定,其中包含群組(Groups),使用者(Users),應用程式網站(Sites)等。

Django admin index page


三.讓polls app在admin的管理介面中是可以編輯的

為了使Poll 物件在管理介面中出現,你必須建立一個admin.py檔在polls的目錄中,檔案的內容如下:

from polls.models import Poll
from django.contrib import admin

admin.site.register(Poll)

你必須重新啟動伺服器才能看見它的改變


四.進階探索管理端的功能

經在polls加入admin.py 檔及重新啟動伺服器後,我們可以在管理端中看到出現polls的區塊

Django admin index page, now with polls displayed

點選polls後可以看到在該應用程式中poll model中所儲存的所有資料項及可透過勾選來刪除資料項。另外也可以點選右上角 "Add poll" 來增加資料項或是點選資料項來進行修改。

Polls change list page

Editing form for poll object

五.客制化管理介面形式

我們可以透過修改 admin.py檔中的 admin.site.register(Poll) 來客制化model在管理介面中的顯示方式,將admin.site.register(Poll)取代為

class PollAdmin(admin.ModelAdmin):
    fields = ['pub_date', 'question']

admin.site.register(Poll, PollAdmin)

重新啟動伺服器,將會看到下列畫面,pub_date與question的欄位順序會因此而改變。

Fields have been reordered

另外,也可以用fieldssets的方式將欄位修改為

class PollAdmin(admin.ModelAdmin):
    fieldsets = [
        (None,               {'fields': ['question']}),
        ('Date information', {'fields': ['pub_date']}),
    ]

admin.site.register(Poll, PollAdmin)
我們可以看到畫面中出現了一個Date information的欄位集合

Form has fieldsets now

當集合中的欄位數量變多時,我們可以利用Django 所提供的一個html class "collapse" 來製作成有收放功能的集合項。

class PollAdmin(admin.ModelAdmin):
    fieldsets = [
        (None,               {'fields': ['question']}),
        ('Date information', {'fields': ['pub_date'], 'classes': ['collapse']}),
    ]
Fieldset is initially collapsed

六.增加關聯物件(related objects)

由models的結構中可以看出Poll可以關聯到多個Choices,如何在管理端顯示這些關係,我們可以在admin.py檔中加入

from mysite.polls.models import Choice

admin.site.register(Choice)

儲存檔案後重新整理瀏覽器後,我們可以看到Polls的目錄中多了Choice的物件可選擇。


Site administration

Auth
Groups Add Change
Users Add Change
Polls
Choices Add Change
Polls Add Change
Sites
Sites Add Change












點選 Choices的 "Add"選項後,會發現可以選擇要歸類到哪一個Poll

Choice admin page

若要使Choices與Poll完全關聯,在新增Poll的畫面中可以順便增加Choice,可將原本admin.py修改為




class ChoiceInline(admin.StackedInline):
    model = Choice
    extra = 3

class PollAdmin(admin.ModelAdmin):
    fieldsets = [
        (None,               {'fields': ['question']}),
        ('Date information', {'fields': ['pub_date'], 'classes': ['collapse']}),
    ]
    inlines = [ChoiceInline]

admin.site.register(Poll, PollAdmin)
它會使得在新增Poll時會出現3個Choice供填寫(inline related objects)

Add poll page now has choices on it

若點選已存在的Poll物件,則會另外再出現三個Choice供填寫,這就是extra = 3的設定。
為節省表格空間,我們可以修改 inline related objects表格的排列方式




class ChoiceInline(admin.TabularInline):
    #...
修改後顯示如下
Add poll page now has more compact choices


七.客制化管理端的物件顯示方式

我們可以藉由在 admin.py 的class 中增加 list_display項目來改變物件的顯示格式





class PollAdmin(admin.ModelAdmin):
    # ...
    list_display = ('question', 'pub_date', 'was_published_today')
Polls change list page, updated
若要縮短標題名稱可以用下列方式將was_published_today縮短成Published today?

def was_published_today(self):
    return self.pub_date.date() == datetime.date.today()
was_published_today.short_description = 'Published today?'
另外我們可以在 PollAdmin中加入list_filter使得在Poll的畫面中多了過濾pub_date的功能

list_filter = ['pub_date']

Polls change list page, updated

過濾日期可選擇的選項為Django預設選項"Any date," "Today," "Past 7 days," "This month," "This year." 。
若欲增加搜尋的功能則可以增加search_fields

search_fields = ['question']

此外我們也可以加入



date_hierarchy = 'pub_date'