Skip to content

Latest commit

 

History

History
113 lines (76 loc) · 4.22 KB

08-django-admin.md

File metadata and controls

113 lines (76 loc) · 4.22 KB

承接昨天的內容,我們現在要來建立幾筆店家資訊來看看。既然店家資訊是放在資料庫,我們可以直接用 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 = [
    url(r'^$', home, name='home'),

    # 這一行把 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 部分不變,這裡省略):

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

這裡宣告了 Store 專用的 admin class,然後指定要在列表顯示 namenotes。為了讓 Django 知道 Store model 應該使用 StoreAdmin,我們這裡改用 admin.register 這個 decorator 來告訴 Django:請在 admin 中註冊 Store 這個 model,並使用 StoreAdmin 來顯示。

重新整理列表頁!你應該會看到多了一個 Notes 欄位。

我們再加上 MenuItem 的 admin:(記得 import MenuItem

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

現在你應該可以新增菜單上的項目了。而且 Django 還會自動把 foreign key 變成一個下拉選單,並且把你所有的項目都放進去!

不過這樣有點怪怪的。通常我們新增店家的時候,都會直接加入菜單。現在這樣要先新增店家,再從 menu item 這裡新增菜單(然後選擇店家),很不方便。所以我們來用 Django admin 內建的 inline admin 功能,把 MenuItem 的 admin 嵌到 Store 的 admin 頁面裡。

先新增一個 inline admin:

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

然後把它加入 StoreAdmin

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

進入一個 Store 的 admin 頁面看看。那家店的菜單變成一個表格被列在下面,而且 Django 還多給你一個空白列,讓你可以繼續新增!方便多了吧。

多多新增一些資料。之後會教你怎麼把這些東西列在網頁上給一般人看。

今天就到這裡!Django admin 還有很多很厲害的功能,有興趣的話請自行參照文件