Django admin自動管理工具是 django.contrib 的一部分,我們可以在項目的 settings.py檔案的 INSTALLED_APPS設定中看到它,可以将它看成django本身自帶的一個app應用程式。
INSTALLED_APPS = ( 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles',)
django.contrib是一套龐大的功能集,它是Django基本代碼的組成部分。
管理工具
在項目的urls.py檔案中添加url(r'^admin/' ,admin.site.urls),一般在生成項目時會自動設定好,我們隻需要去掉注釋就行。
from django.conf.urls import urlfrom django.contrib import adminurlpatterns = [ url(r'^admin/', admin.site.urls),]
使用管理工具
啟動開發伺服器,然後在浏覽器中通路 http://127.0.0.1:8000/admin/,得到登陸界面,如下圖所示:
接着可以通過指令 python manage.py createsuperuser來建立超級使用者。
>> python manage.py createsuperuserUsername (leave blank to use 'root'): 使用者名Email address: 郵箱Password: 密碼Password (again): 确認密碼Superuser created successfully.
建立好超級使用者之後我們可以在剛剛的那個登入界面輸入使用者名和密碼,登入成功後的界面如下所示:
為了讓 admin 界面管理某個資料模型,我們需要先注冊該資料模型到 admin。比如我們之前在TestApp中已經建立了模型Test。修改TestApp/admin.py檔案:
from django.contrib import adminfrom TestApp.models import Test# Register your models here.admin.site.register(Test)
在網頁中重新整理後即可看到TestApp資料表,如下圖:
複雜的背景資料模型
我們的django頁面管理功能非常強大,完全有能力處理更加複雜的資料模型。
首先我們可以在TestApp/models.py檔案中增加兩個表(資料模型):
from django.db import models# Create your models here.class Test(models.Model): name = models.CharField(max_length=20)class Contact(models.Model): name = models.CharField(max_length=200) age = models.IntegerField(default=0) email = models.EmailField() def __unicode__(self): return self.nameclass Tag(models.Model): contact = models.ForeignKey(Contact, on_delete=models.CASCADE, ) name = models.CharField(max_length=50) def __unicode__(self): return self.name
上述兩個表中,Tag以Contact為外部鍵。一個Contact可以對應多個Tag。
在TestApp/admin.py檔案中注冊多個模型并顯示:
from django.contrib import adminfrom TestApp.models import Test,Contact,Tag# Register your models here.admin.site.register([Test, Contact,Tag])
重新整理管理頁面,顯示結果如下所示:
在以上管理工具我們就能進行複雜模型操作。
自定義表單
我們可以自定義管理頁面,來取代預設的頁面。比如上面的 "add" 頁面。我們想隻顯示 name 和 email 部分。修改 TestApp/admin.py:
from django.contrib import adminfrom TestApp.models import Test, Contact, Tag# Register your models here.class ContactAdmin(admin.ModelAdmin): fields = ('name', 'email')admin.site.register(Contact, ContactAdmin)admin.site.register([Test, Tag])
以上代碼定義了一個 ContactAdmin 類,用以說明管理頁面的顯示格式。其中fields 屬性定義了要顯示的字段。
由于該類對應的是 Contact 資料模型,我們在注冊的時候,需要将它們一起注冊。顯示效果如下:
還可以将輸入欄分塊,每個欄也可以定義自己的格式。修改 TestApp/admin.py為:
from django.contrib import adminfrom TestApp.models import Test, Contact, Tag# Register your models here.class ContactAdmin(admin.ModelAdmin): fieldsets = ( ['Main', { 'fields': ('name', 'email'), }], ['Advance', { 'classes': ('collapse',), # CSS 'fields': ('age',), }] )admin.site.register(Contact, ContactAdmin)admin.site.register([Test, Tag])
上面的欄目分為了 Main 和 Advance 兩部分。classes 說明它所在的部分的 CSS 格式。這裡讓 Advance 部分隐藏:
Advance 部分旁邊有一個 Show 按鈕,用于展開,展開後可點選 Hide 将其隐藏,如下圖所示:
内聯(Inline)顯示
上面的 Contact 是 Tag 的外部鍵,是以有外部參考的關系。而在預設的頁面顯示中,将兩者分離開來,無法展現出兩者的從屬關系。我們可以使用内聯顯示,讓 Tag 附加在 Contact 的編輯頁面上顯示。
修改TestApp/admin.py:
from django.contrib import adminfrom TestApp.models import Test, Contact, Tag# Register your models here.class TagInline(admin.TabularInline): model = Tagclass ContactAdmin(admin.ModelAdmin): inlines = [TagInline] # Inline fieldsets = ( ['Main', { 'fields': ('name', 'email'), }], ['Advance', { 'classes': ('collapse',), 'fields': ('age',), }] )admin.site.register(Contact, ContactAdmin)admin.site.register([Test])
通路頁面後的效果圖如下所示:
清單頁的顯示
我們也可以自定義Contact 的清單頁的顯示,比如在清單中顯示更多的欄目,隻需要在 ContactAdmin 中增加 list_display 屬性:
from django.contrib import adminfrom TestApp.models import Test, Contact, Tag# Register your models here.class TagInline(admin.TabularInline): model = Tagclass ContactAdmin(admin.ModelAdmin): list_display = ('name', 'age', 'email') # list inlines = [TagInline] # Inline fieldsets = ( ['Main', { 'fields': ('name', 'email'), }], ['Advance', { 'classes': ('collapse',), 'fields': ('age',), }] )admin.site.register(Contact, ContactAdmin)admin.site.register([Test])
重新整理頁面後效果如圖所示:
搜尋功能
搜尋功能在管理大量記錄時非常有,我們可以使用 search_fields 為該清單頁增加搜尋欄:
from django.contrib import adminfrom TestApp.models import Test, Contact, Tag# Register your models here.class TagInline(admin.TabularInline): model = Tagclass ContactAdmin(admin.ModelAdmin): list_display = ('name', 'age', 'email') # list search_fields = ('name',) inlines = [TagInline] # Inline fieldsets = ( ['Main', { 'fields': ('name', 'email'), }], ['Advance', { 'classes': ('collapse',), 'fields': ('age',), }] )admin.site.register(Contact, ContactAdmin)admin.site.register([Test])
參考:https://www.9xkd.com