做者:Vamei 出處:http://www.cnblogs.com/vamei 歡迎轉載,也請保留這段聲明。謝謝! html
Django提供一個管理數據庫的app,即django.contrib.admin。這是Django最方便的功能之一。經過該app,咱們能夠直接經由web頁面,來管理咱們的數據庫。這一工具,主要是爲網站管理人員使用。python
這個app一般已經預裝好,你能夠在mysite/settings.py中的INSTALLED_APPS看到它。web
「這莊園裏的事情,都逃不過個人眼睛」,管家放下帳本,洋洋得意。數據庫
admin界面位於[site]/admin這個URL。這一般在mysite/urls.py中已經設置好。好比,下面是個人urls.py:django
from django.conf.urls import patterns, include, url from django.contrib import admin admin.autodiscover() # admin
urlpatterns = patterns('', url(r'^admin/', include(admin.site.urls)), # admin
url(r'^west/', include('west.urls')), )
爲了讓admin界面管理某個數據模型,咱們須要先註冊該數據模型到admin。好比,咱們以前在west中建立的模型Character。修改west/admin.py:app
from django.contrib import admin from west.models import Character # Register your models here.
admin.site.register(Character)
訪問http://127.0.0.1:8000/admin,登陸後,能夠看到管理界面:工具
這個頁面除了west.characters外,還有用戶和組信息。它們來自Django預裝的Auth模塊。咱們將在之後處理用戶管理的問題。網站
「我已經管理這個莊園幾十年了。」url
管理頁面的功能強大,徹底有能力處理更加複雜的數據模型。spa
先在west/models.py中增長一個更復雜的數據模型:
from django.db import models # Create your models here.
class Contact(models.Model): name = models.CharField(max_length=200) age = models.IntegerField(default=0) email = models.EmailField() def __unicode__(self): return self.name class Tag(models.Model): contact = models.ForeignKey(Contact) name = models.CharField(max_length=50) def __unicode__(self): return self.name
這裏有兩個表。Tag以Contact爲外部鍵。一個Contact能夠對應多個Tag。
咱們還能夠看到許多在以前沒有見過的屬性類型,好比IntegerField用於存儲整數。
同步數據庫:
$python manage.py syncdb
在west/admin.py註冊多個模型並顯示:
from django.contrib import admin from west.models import Character,Contact,Tag # Register your models here.
admin.site.register([Character, Contact, Tag])
模型將在管理頁面顯示。好比Contact的添加條目的頁面以下:
「這些黑鬼在想什麼,我一清二楚。」
咱們能夠自定義管理頁面,來取代默認的頁面。好比上面的"add"頁面。咱們想只顯示name和email部分。修改west/admin.py:
from django.contrib import admin from west.models import Character,Contact,Tag # Register your models here.
class ContactAdmin(admin.ModelAdmin): fields = ('name', 'email') admin.site.register(Contact, ContactAdmin) admin.site.register([Character, Tag])
上面定義了一個ContactAdmin類,用以說明管理頁面的顯示格式。裏面的fields屬性,用以說明要顯示的輸入欄。咱們沒有讓"age"顯示。因爲該類對應的是Contact數據模型,咱們在註冊的時候,須要將它們一塊兒註冊。顯示效果以下:
咱們還能夠將輸入欄分塊,給每一塊輸入欄以本身的顯示格式。修改west/admin.py爲:
from django.contrib import admin from west.models import Character,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([Character, Tag])
上面的欄目分爲了Main和Advance兩部分。classes說明它所在的部分的CSS格式。這裏讓Advance部分收斂起來:
Advance部分旁邊有一個Show按鈕,用於展開。
「這兩個客人,彷佛沒有那麼簡單。」
上面的Contact是Tag的外部鍵,因此有外部參考的關係。而在默認的頁面顯示中,將二者分離開來,沒法體現出二者的從屬關係。咱們可使用Inline顯示,讓Tag附加在Contact的編輯頁面上顯示。
修改west/admin.py:
from django.contrib import admin from west.models import Character,Contact,Tag # Register your models here. class TagInline(admin.TabularInline): model = Tag class ContactAdmin(admin.ModelAdmin): inlines = [TagInline] # Inline fieldsets = ( ['Main',{ 'fields':('name','email'), }], ['Advance',{ 'classes': ('collapse',), 'fields': ('age',), }] ) admin.site.register(Contact, ContactAdmin) admin.site.register([Character])
效果以下:
「但我也不是好惹的。」
在Contact輸入數條記錄後,Contact的列表頁看起來以下:
咱們也能夠自定義該頁面的顯示,好比在列表中顯示更多的欄目,只須要在ContactAdmin中增長list_display屬性:
from django.contrib import admin from west.models import Character,Contact,Tag # Register your models here.
class ContactAdmin(admin.ModelAdmin): list_display = ('name','age', 'email') # list
admin.site.register(Contact, ContactAdmin) admin.site.register([Character, Tag])
列表頁新的顯示效果以下:
咱們還能夠爲該列表頁增長搜索欄。搜索功能在管理大量記錄時很是有用。使用search_fields說明要搜索的屬性:
from django.contrib import admin from west.models import Character,Contact,Tag # Register your models here. class ContactAdmin(admin.ModelAdmin): list_display = ('name','age', 'email') search_fields = ('name',) admin.site.register(Contact, ContactAdmin) admin.site.register([Character])
效果以下:
「我要替小主人留心了。」
Django的管理頁面有很豐富的數據庫管理功能,並能夠自定義顯示方式,是很是值得使用的工具。
「誰,也逃不出個人眼睛!」
歡迎閱讀「被解放的姜戈」系列文章。