註:因為鐵人賽的編輯器實在難用到爆炸,出來的結果又醜(我絕對沒有責怪 iTHome 技術團隊的意思,絕對沒有喔,絕對沒有對你們感到不爽~~~),越寫越不爽,所以我決定把草稿都放在這裡。直接看這個版本應該會舒服很多,不要再用這個懶介面了。我在裡面也放了範例專案的源碼(不包含 venv 與資料庫),並且按照章節 commit 對應的版本。如果你會用 Git(不會的話你應該現在就去學)就可以看到各階段的專案狀態。
以下進入正題。
承接昨天的內容,我們現在要來建立幾筆店家資訊來看看。既然店家資訊是放在資料庫,我們可以直接用 SQL 把資料塞進去。或者,因為 Django 是用 ORM,我們也可以寫程式把東西放進去。不過在這種狀況下 command line 總是有點麻煩。有 GUI 的選擇嗎?
有。Django 內建了一個 admin 介面,方便你快速產生一個簡單的管理平台。打開 lunch/settings/base.py,確認 INSTALLED_APPS 有包含 admin app:
INSTALLED_APPS = (
'stores',
'django.contrib.admin', # 這一行啟用 Django admin。
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
)
接著打開 lunch/urls.py,確認 admin 有被對應到 Django admin:
urlpatterns = patterns(
'',
url(r'^admin/', include(admin.site.urls),
)
urls.py 本身的功能我們之後再講。
接著用以下的指令,建立一個超級使用者帳號(用來登入管理介面):
python manage.py createsuperuser
輸入帳號與密碼。(Pro tip: email 其實可以留白,直接按 enter 就行了!)
接著把 Django 跑起來:
python manage.py runserver
然後用瀏覽器打開 http://localhost:8000/admin/。你應該會看到登入頁面,輸入剛剛的帳密後就可以進入管理頁面了!
不過我們之前建的 models 都沒有出來。因為我們沒有告訴 Django 要怎麼顯示它們。
打開 stores/admin.py,把內容改成這樣:
from django.contrib import admin
from .models import Store
admin.site.register(Store)
重新整理 admin 網頁(記得 runserver 要繼續跑,如果它停掉了請重新執行它)。你應該會看到多了一欄 Stores!
點右邊的 Add 來新增一筆資料。
按下 Save,就會多一筆資料。多建幾筆來看看!
資料多了之後,列表畫面好像就有點乾。我們來把 notes 欄位也顯示在上面。重新修改 stores/admin.py,把內容改成下面這樣(import 部分不變,這裡省略):
class StoreAdmin(admin.ModelAdmin):
list_display = ('name', 'notes',)
admin.site.register(Store, StoreAdmin)
我們宣告了 Store 專用的 admin class,然後指定要在列表顯示 name 和 notes。然後我們在註冊 Store 時,指定使用 StoreAdmin。
重新整理列表頁!你應該會看到多了一個 Notes 欄位。
我們再加上 MenuItem 的 admin:(記得 import MenuItem)
class MenuItemAdmin(admin.ModelAdmin):
list_display = ('name', 'price',)
admin.site.register(MenuItem, MenuItemAdmin)
現在你應該可以新增菜單上的項目了。而且 Django 還會自動把 foreign key 變成一個下拉選單,並且把你所有的項目都放進去!
不過這樣有點怪怪的。通常我們新增店家的時候,都會直接加入菜單。現在這樣要先新增店家,再從 menu item 這裡新增菜單(然後選擇店家),很不方便。所以我們來用 Django admin 內建的 inline admin 功能,把 MenuItem 的 admin 嵌到 Store 的 admin 頁面裡。
先新增一個 inline admin:
class MenuItemInline(admin.StackedInline):
model = MenuItem
extra = 1
然後把它加入 StoreAdmin:
class StoreAdmin(admin.ModelAdmin):
list_display = ('name', 'notes',)
inlines = (MenuItemInline,)
進入一個 Store 的 admin 頁面看看。那家店的菜單變成一個表格被列在下面,而且 Django 還多給你一個空白列,讓你可以繼續新增!方便多了吧。
多多新增一些資料。之後會教你怎麼把這些東西列在網頁上給一般人看。
今天就到這裡!Django admin 還有很多很厲害的功能,有興趣的話請自行參照文件。