iT邦幫忙

DAY 8
0

為程式人寫的 Django Tutorial系列 第 8

Django Tutorial for Programmers: 8. Admin

註:因為鐵人賽的編輯器實在難用到爆炸,出來的結果又醜(我絕對沒有責怪 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(
'',

Examples:

url(r'^$', 'lunch.views.home', name='home'),

url(r'^blog/', include('blog.urls')),

這一行把 admin/ 下面的 URL 對應到 Django admin。

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 還有很多很厲害的功能,有興趣的話請自行參照文件


上一篇
Django Tutorial for Programmers: 7. Models
下一篇
Django Tutorial for Programmers: 9. Model View
系列文
為程式人寫的 Django Tutorial30

尚未有邦友留言

立即登入留言