2015年7月12日 星期日

Python筆記:Django(5) Admin

Django 內建了一個 admin 介面,方便你快速產生一個簡單的管理平台。


建立一個超級使用者帳號(用來登入管理介面):

python manage.py createsuperuser

會要求設定帳號密碼,設定完之後執行runserver

python2.7 manage.py runserver 192...

在瀏覽器輸入網址:http://192.168.0.4:8000/admin會出現登入頁面.
enter image description here

為了在管理者畫面能夠看到你設定的model,將下面的code加入admin.py

註冊model

admin管理平台的功能或是頁面呈現的樣子都是預設的,但我們其實可以針對我們理想中的介面進行客製化。這有賴於註冊模型於admin上時,要採用繼承於ModelAdmin的自定義類別。
透過admin.site.register方法,便可以在admin介面中新增、檢視、編輯、刪除我們模型中的資料。

from django.contrib import admin
from .models import MenuItem, Store

@admin.register(MenuItem)
class MenuItemAdmin(admin.ModelAdmin):
    list_display = ('name', 'price',)

@admin.register(Store)

定義了一個繼承自MenuItem的MenuItemAdmin類別,list_display這個元組變數,此元組裡面的每個元素都是一個字串而且要是模型欄位的名字。只要有指定在此元組的欄位,都會被顯示在admin中的全檢視頁面中。

再設定任何一個元組的時候,如果只有一個元素,請務必要加上一個,來避免誤會

list_filter: 過濾器能夠針對特定欄位的值,進行過濾,在全檢視頁面中只顯示特定欄位值的資料。
Ex.

 list_filter = ('CharField',)

search_fields: 當資料漸漸龐大,而想要檢視某部分特定的資料時
Ex.

 search_fields = ('name',)

用 Django admin 內建的 inline admin 功能,把 MenuItem 的 admin 嵌到 Store 的 admin 頁面裡。

class MenuItemInline(admin.StackedInline):
model = MenuItem
extra = 1

結果:

#stores/admin.py
from django.contrib import admin
from .models import MenuItem, Store

class MenuItemInline(admin.TabularInline):
    model = MenuItem
    extra = 1

@admin.register(MenuItem)
class MenuItemAdmin(admin.ModelAdmin):
    list_display = ('name', 'price',)

@admin.register(Store)
class StoreAdmin(admin.ModelAdmin):
    list_display = ('name', 'notes',)
    inlines = (MenuItemInline,)

留空白

在資料庫中,有兩種值都可能被稱為空白,一種是NULL,另外一種是空字串。有的時候這種差異和不一致會造成麻煩,舉例來說,我想找出所有有空白欄位的資料,我們對於使用NULL來檢查或是空字串來檢查可能會有疑義。

為了統一,Django在模型生成的時候會自動將各欄位設置為非NULL:NOT NULL

對於留白的欄位,我們便知道Django會寫入空字串到資料庫中,而不會是NULL了。但是這又產生了另外一個問題,日期跟時間的欄位是不允許空字串輸入的,為了留空,他必須允許NULL值的填入,解決的辦法是在模型撰寫時,用參數null=True來允許表格為NULL,結合以上兩點,對於一個可允許留空的時間日期欄位,我們必須同時指定blank=Truenull=True。不過對於已經生成好的資料表而言,我們若是回過頭要加入null=True的特性,又牽扯到資料表結構的異動,這部份便要留待之後說明。

 date = models.DateField(blank=True, null=True)

欄位名稱還有一個玄機,我們會發現,Django會用以下規則為模型在admin中的欄位名稱命名。

欄位名稱 = 屬性名稱首字大寫 + 以空白取代屬性中的底線
e.g. phone_number => Phone number

如果大家不滿意這種命名規則,可以在模型中利用verbose_name來指定想要的名稱:

 phone_number = models.CharField(max_length=15,verbose_name='poneNum')

admin管理功能與自定義ModelAdmin

admin管理平台的功能或是頁面呈現的樣子都是預設的,但我們其實可以針對我們理想中的介面進行客製化。這有賴於註冊模型於admin上時,要採用繼承於ModelAdmin的自定義類別。

列表顯示

mysite/restaurant/admin.py
from django.contrib import admin
from restaurants.models import Restaurant, Food

class RestaurantAdmin(admin.ModelAdmin):
    list_display = ('name', 'phone_number', 'address')

admin.site.register(Restaurant,RestaurantAdmin)
admin.site.register(Food)

定義了一個繼承自admin.ModelAdmin的RestaurantAdmin類別,裡面我們使用了list_display這個元組變數,此元組裡面的每個元素都是一個字串而且要是模型欄位的名字。

設定任何一個元組的時候,如果只有一個元素,請務必要加上一個,來避免誤會,切記切記。admin設置如果有誤可以先檢查一下是不是有單一元素的tuple沒有給定逗號。

class FoodAdmin(admin.ModelAdmin):
    list_display = ('name', 'restaurant', 'price')
    list_filter = ('is_spicy',)
    search_fields = ('name',)
    fields = ('price','restaurant') #這將會使得price欄位出現在restaurant欄位之前,而且name、is_spicy和comment欄位都不會出現,不能被編輯。
    ordering = ('-price',)

列表過濾: 檢視頁面中的右側加入了過濾器,對於is_spicy這個布林資料來說,他可以過濾出is_spicy為True的資料或是is_spicy為False的資料。
搜尋欄位: 在restaurant的檢視畫面上方看到一個搜尋欄位,而此欄位的搜尋將以name欄位為主,使用者們可以同時設定多個欄位。
排序: 設定ordering元組,指定欄位名稱,資料便會依照指定欄位進行排序,加入一個減號可以實現降序排序。
自定義編輯欄位: 當我們點擊了一筆資料之後,便會進入編輯頁面,admin預設開放所有的欄位進行編輯,而順序也依照欄位當初被設置的順序,為了客製化這一點,可以利用fields元組。fields元組的元素也是資料欄位的名稱,其順序就是編輯頁面欄位出現的順序,而沒有出現在fields元組中的欄位,將不出現在編輯頁面中,無法被編輯。這可以有效地防止一些特定的資料無法被手動新增或修改。

沒有留言:

張貼留言