作者:Vamei 出處:http://www.cnblogs.com/vamei 歡迎轉(zhuǎn)載,也請(qǐng)保留這段聲明。謝謝!
Django提供一個(gè)管理數(shù)據(jù)庫的app,即django.contrib.admin。這是Django最方便的功能之一。通過該app,我們可以直接經(jīng)由web頁面,來管理我們的數(shù)據(jù)庫。這一工具,主要是為網(wǎng)站管理人員使用。
這個(gè)app通常已經(jīng)預(yù)裝好,你可以在mysite/settings.py中的INSTALLED_APPS看到它。
默認(rèn)界面
啟動(dòng)一個(gè)django項(xiàng)目默認(rèn)會(huì)在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'^$','mysite.views.first_page'),
url(r'^west/',include('west.urls')),
)
數(shù)據(jù)模型先必須注冊(cè)到admin才能被管理。
在west/admin.py中:注冊(cè)之前Character數(shù)據(jù)模型(類,一張數(shù)據(jù)庫表結(jié)構(gòu))
#
from django.contrib import admin
from west.models import Character
# Register your models here.
admin.site.register(Character)
接著我們就可以訪問http://localhost:8000/admin。
這里admin在urls.py中映射到視圖admin.site.urls,默認(rèn)的,自動(dòng)去搜索
注意:打開admin頁面時(shí),實(shí)驗(yàn)環(huán)境是django1.8,python3.4報(bào)錯(cuò)了,
# 'WSGIRequest' object has no attribute 'user'
django1.9之前(settings.py) MIDDLEWARE 應(yīng)該是MIDDLEWARE_CLASSES 1.9之后的版本應(yīng)該是叫MIDDLEWARE
修改此處解決錯(cuò)誤。
登錄admin的用戶是在進(jìn)行DB同步時(shí),創(chuàng)建的管理員賬戶。
1
復(fù)雜模型
在west/models.py中創(chuàng)建復(fù)雜數(shù)據(jù)模型
#
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
兩個(gè)表,Tag與Contact,Tag以Contact為外鍵約束,id在Content中沒有表示為主鍵,怎么可以當(dāng)其他表的外鍵呢?還是說不是這樣理解。
同步數(shù)據(jù)庫:
# python3.4 manage.py syncdb
# 提示信息:
# Your models have changes that are not yet reflected in a migration, and so won't be applied.
# Run 'manage.py makemigrations' to make new migrations, and then re-run 'manage.py migrate' to apply them.
# 按照提示運(yùn)行
# python3.4 manage.py makemigrations
# python3.4 manage.py syncdb
將數(shù)據(jù)模型注冊(cè)到admin管理
# from django.contrib import admin
# from west.models import Character, Contact, Tag
# # Register your models here.
# admin.site.register([Character, Contact, Tag])
2
自定義頁面
可以自定義管理頁面,來取代默認(rèn)的頁面。比如上面的"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])
上面定義了一個(gè)ContactAdmin類,用以說明管理頁面的顯示格式。里面的fields屬性,用以說明要顯示的輸入欄。我們沒有讓"age"顯示。由于該類對(duì)應(yīng)的是Contact數(shù)據(jù)模型,我們?cè)谧?cè)的時(shí)候,需要將它們一起注冊(cè)。
我們還可以將輸入欄分塊,給每一塊輸入欄以自己的顯示格式。修改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部分收斂起來
3
Inline顯示
上面的Contact是Tag的外部鍵,所以有外部參考的關(guān)系。而在默認(rèn)的頁面顯示中,將兩者分離開來,無法體現(xiàn)出兩者的從屬關(guān)系。我們可以使用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])
顯示效果:
4
添加搜索欄:
在class ContactAdmin類中添加:
# search_fields = ('name',)