Django 內建了一個 admin 介面,方便你快速產生一個簡單的管理平台。
建立一個超級使用者帳號(用來登入管理介面):
python manage.py createsuperuser
會要求設定帳號密碼,設定完之後執行runserver
python2.7 manage.py runserver 192...
在瀏覽器輸入網址:http://192.168.0.4:8000/admin
會出現登入頁面.
為了在管理者畫面能夠看到你設定的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=True
和null=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元組中的欄位,將不出現在編輯頁面中,無法被編輯。這可以有效地防止一些特定的資料無法被手動新增或修改。
沒有留言:
張貼留言