Photo by Tim Arterbury on Unsplash
Django Administration(管理員後台)是在建立Django專案時,預設提供的功能,在上面除了能夠進行基本的使用者集群組管理外,也可以在上面彈性的加入自己Django專案的資料模型(Model),來擁有屬於這個專案的後台,就算不使用Django預設的SQLite資料庫,而使用其它的資料庫,同樣可以使用,無須自己從頭開發,相當的強大。
本文將分享Django Administration(管理員後台)的操作介面,以及說明如何透過Django專案中的admin.py檔案,來進行介面的客製化,重點包含:
- Django Administration操作
- Django admin.py檔案
- Django Administration客製化資料表顯示欄位
- Django Administration客製化資料表單欄位
一、Django Administration操作
要使用Django專案的Administration(管理員後台),首先,需註冊一個超級使用者(SuperUser)的帳號密碼,開啟Visual Studio Code的Terminal視窗,輸入以下指令:
python manage.py createsuperuser
執行結果
從執行結果可以看到,執行指令後,會逐步的設定管理者帳號、電子郵件及密碼,完成後,利用以下指令啟動本地端伺服器:
python manage.py runserver
執行結果
接著開啟瀏覽器,輸入執行結果的網址,並且加上/admin,即可看到Django Administration(管理員後台)的登入畫面,如下圖:
輸入剛剛所建立的超級使用者(SuperUser)帳號密碼後,可以看到Django專案中的使用者(Users)及群組(Groups)資料模型,如下圖:
以使用者(Users)資料模型為例,點擊Users後,可以看到其資料表,並且提供了查詢、新增、篩選及排序等操作,來管理Django專案的使用者,如下圖:
二、Django admin.py檔案
admin.py檔案主要就是用來註冊資料模型(Model)及客製化Django Administration(管理員後台)的顯示方式。現在,如果想要把Django專案中的應用程式(APP)資料模型(Model),加入到Django Administration(管理員後台),就可以透過應用程式(APP)底下的admin.py檔案來達成。
首先,開啟admin.py檔案,引用應用程式(APP) models.py中的Location及Posts資料模型,接著透過admin物件,將這兩個資料模型註冊到Django Administration(管理員後台)上,如下範例:
首先,開啟admin.py檔案,引用應用程式(APP) models.py中的Location及Posts資料模型,接著透過admin物件,將這兩個資料模型註冊到Django Administration(管理員後台)上,如下範例:
from django.contrib import admin
from .models import Location, Post
admin.site.register(Location) #註冊至Administration(管理員後台)
admin.site.register(Post) #註冊至Administration(管理員後台)
三、Django Administration客製化資料表顯示欄位
Django Administration(管理員後台)有了應用程式(APP)的資料模型後,現在來試著新增一個景點位置,點擊Locations資料模型,接著選擇右上角的ADD LOCATION按鈕,填寫景點位置名稱,如下圖:
如果您喜歡我的文章,請幫我按五下Like(使用Google或Facebook帳號免費註冊),支持我創作教學文章,回饋由LikeCoin基金會出資,完全不會花到錢,感謝大家。
儲存後,可以看到如下圖的畫面:
由於習慣上來說,會想要將資料模型中的各個欄位顯示出來,所以畫面中的顯示介面看起來就較不友善,這時候同樣可以透過應用程式(APP)下的admin.py檔案來進行客製化,如下範例:
from django.contrib import admin
from .models import Location, Post
class LocationAdmin(admin.ModelAdmin):
list_display = ('id', 'name')
admin.site.register(Location, LocationAdmin) #註冊至Administration(管理員後台)
admin.site.register(Post) #註冊至Administration(管理員後台)
首先,建立LocationAdmin類別,繼承自ModelAdmin類別(Class),其中封裝了應用程式(APP)資料模型在Administration(管理員後台)的顯示方式及功能,所以,可以利用覆寫(Method Overriding) list_display屬性(Attribute)的方式,設定要顯示的欄位元組(Tuple),並且將LocationAdmin類別註冊至Administration(管理員後台)上。
除此之外,在應用程式(APP)下的models.py檔案中,Location資料模型類別,需覆寫(Method Overriding) __str__特殊方法(Magic Method),來定義name欄位的字串顯示方式,如下範例:
除此之外,在應用程式(APP)下的models.py檔案中,Location資料模型類別,需覆寫(Method Overriding) __str__特殊方法(Magic Method),來定義name欄位的字串顯示方式,如下範例:
# 景點位置
class Location(models.Model):
name = models.CharField(max_length=255)
def __str__(self):
return self.name #顯示景點位置
最後重新整理瀏覽器的Administration(管理員後台)畫面,就可以看到如下的結果:
同樣的作法,設定Posts資料模型的資料表顯示欄位,如下範例:
from django.contrib import admin
from .models import Location, Post
class LocationAdmin(admin.ModelAdmin):
list_display = ('id', 'name')
class PostAdmin(admin.ModelAdmin):
list_display = ('subject', 'content', 'author', 'location')
admin.site.register(Location, LocationAdmin) #註冊至Administration(管理員後台)
admin.site.register(Post, PostAdmin) #註冊至Administration(管理員後台)
四、Django Administration客製化資料表單欄位
新增了景點位置後,接下來,在景點貼文的資料模型(Posts),也來新增一筆資料,如下圖:
由於在應用程式(APP)下的models.py中,定義了景點貼文資料模型(Posts)的create_date(建立貼文日期)欄位,預設為當下時區的日期,所以在Django Administration(管理員後台)的新增畫面上,預設顯示當下的日期,如果不想要顯示這個欄位,可以在應用程式(APP)下的admin.py PostsAdmin類別中,透過覆寫(Method Overriding) exclude屬性(Attribute),設定不要顯示的欄位元組(Tuple),如下範例:
from django.contrib import admin
from .models import Location, Post
class LocationAdmin(admin.ModelAdmin):
list_display = ('id', 'name')
class PostAdmin(admin.ModelAdmin):
list_display = ('subject', 'content', 'author', 'location')
exclude = ('create_date', )
admin.site.register(Location, LocationAdmin) #註冊至Administration(管理員後台)
admin.site.register(Post, PostAdmin) #註冊至Administration(管理員後台)
或是覆寫(Method Overriding) fields屬性(Attribute),設定要顯示的欄位元組(Tuple),如下範例:
from django.contrib import admin
from .models import Location, Post
class LocationAdmin(admin.ModelAdmin):
list_display = ('id', 'name')
class PostAdmin(admin.ModelAdmin):
list_display = ('subject', 'content', 'author', 'location')
fields = ('subject', 'content', 'author', 'location')
admin.site.register(Location, LocationAdmin) #註冊至Administration(管理員後台)
admin.site.register(Post, PostAdmin) #註冊至Administration(管理員後台)
五、小結
透過今天的教學,各位應該可以感受到,當資料庫端建置完成後,除了可以透過Django所提供的Administration(管理員後台)介面來進行管理外,又可以客製化應用程式(APP)的資料模型在後台的顯示方式,非常的強大吧。如果在練習的過程中,有遇到任何問題,歡迎留言提問,我將盡力為各位解答。
如果您喜歡我的文章,請幫我按五下Like(使用Google或Facebook帳號免費註冊),支持我創作教學文章,回饋由LikeCoin基金會出資,完全不會花到錢,感謝大家。
謝謝你! 我買書使用eclipse都一直失敗。讀你的文章挺順利的!
回覆刪除另外本篇使用 exclude 以及 fields的方式來選擇要顯示甚麼這邊,我都失敗耶! 重新整理都還是有顯示
Django==3.0.3
Kai您好:
刪除檢查一下在使用exclude時,如果只有指定一個欄位,是否有在欄位名稱後面加上逗號,例:exclude = ('create_date', )。因為只有一個欄位的話,最後需要加上逗號,Python才會認為是元組(Tuple)。
另外,在完成修改admin.py檔案中的顯示及排除欄位後,建議重新執行專案(python manage.py runserver),確保修改的內容有被執行。
如果以上沒辦法解決問題的話,歡迎到Learn Code With Mike粉絲專頁私訊我,來協助您找出問題,感謝您的支持 :)
list_display = ('subject', 'content', 'author', 'location') 中已排除'create_date', 執行結果畫面上就不會有該欄位, 為何還要exclude?
回覆刪除sayspen 您好:
刪除您說的沒錯,只要在list_display中排除即可,文中還會使用exclude是純粹說明另一個可以排除欄位顯示的方法,感謝您的提問 :)
exclude 或 fields 是讓我們新增資料時有或沒有可輸入的特定欄位
刪除list_display 是用來客製化顯示的list
所以如果只讓list_display沒有,新增時還是存在可調整的create_date欄位
感謝ZMH的補充說明,解釋的非常精準 :)
刪除MIKE大您好,有一個地方不太明白,
回覆刪除覆寫(Method Overriding) __str__特殊方法(Magic Method)
這一處的功用為何呢? 因為貌似沒有加上的話,功能也沒有出現差異。
您好,如果沒有覆寫(Method Overriding) __str__特殊方法(Magic Method),在ADD LOCATION(新增景點位置)後,會顯示Location object(1),這時候,如果想要正常的顯示景點位置名稱(ex:中壢地區)而不是Location object(1)的話,就需要覆寫(Method Overriding) __str__特殊方法(Magic Method)。
刪除了解了! 謝謝
刪除你好,Mike大大
回覆刪除我在設置完以下這兩個後,後台管理介面上 Location的部分沒有顯示id,Post還是有顯示create_date,請問有可能是什麼問題嗎?
p.s 有重新執行專案(python manage.py runserver)
class LocationAdmin(admin.ModelAdmin):
list_display = ('id', 'name')
class PostAdmin(admin.ModelAdmin):
list_display = ('subject', 'content', 'author', 'location')
exclude = ('create_date', )
有把PostAdmin 確實加入admin.site.register(Post)變成admin.site.register(Post, PostAdmin)嗎?
刪除mike大你好:我照網站操作時卡在了 "透過admin物件,將這兩個資料模型註冊到Django Administration(管理員後台)上",我確實的照範例輸入後完成後,重新整理瀏覽器的Django Administration(管理員後台),卻看不到Django應用程式(APP)的Locations及Posts資料模型,請問有可能債那裡出了問題?感謝老師協助
回覆刪除你好我在創建超級使用者要進到管理者的介面時會出現
回覆刪除A server error occurred. Please contact the administrator.
一直都找不到是什麼原因