被解放的姜戈05 黑麪管家

做者: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按鈕,用於展開。

 

「這兩個客人,彷佛沒有那麼簡單。」

 

Inline顯示

上面的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的管理頁面有很豐富的數據庫管理功能,並能夠自定義顯示方式,是很是值得使用的工具。

 

「誰,也逃不出個人眼睛!」

 

歡迎閱讀「被解放的姜戈」系列文章。

相關文章
相關標籤/搜索