被解放的姜戈05 黑面管家


作者:Vamei 出處:http://www.cnblogs.com/vamei 歡迎轉載,也請保留這段聲明。謝謝! 

 

Django提供一個管理數據庫的app,即django.contrib.admin。這是Django最方便的功能之一。通過該app,我們可以直接經由web頁面,來管理我們的數據庫。這一工具,主要是為網站管理人員使用。

這個app通常已經預裝好,你可以在mysite/settings.py中的INSTALLED_APPS看到它。

“這庄園里的事情,都逃不過我的眼睛”,管家放下賬本,洋洋得意。

 

默認界面

admin界面位於[site]/admin這個URL。這通常在mysite/urls.py中已經設置好。比如,下面是我的urls.py:

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:

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模塊。我們將在以后處理用戶管理的問題。

 

“我已經管理這個庄園幾十年了。”

 

復雜模型

管理頁面的功能強大,完全有能力處理更加復雜的數據模型。

 

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

 

“誰,也逃不出我的眼睛!”

 

歡迎閱讀“被解放的姜戈”系列文章。

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM