Django 提供了基於 web 的管理工具。html
Django 自動管理工具是 django.contrib 的一部分。你能夠在項目的 settings.py 中的 INSTALLED_APPS 看到它:python
INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', "app01" ]
django.contrib是一套龐大的功能集,它是Django基本代碼的組成部分。git
一般咱們在生成項目時會在 urls.py 中自動設置好,以下:web
from django.conf.urls import url from django.contrib import admin urlpatterns = [ url(r'^admin/', admin.site.urls), ]
當這一切都配置好後,Django 管理工具就能夠運行了。django
啓動項目,而後在瀏覽器中訪問 http://127.0.0.1:8000/admin/,跳轉到登錄界面。你能夠經過命令 python manage.py createsuperuser 來建立超級用戶(在以前的auth模塊有說明)。瀏覽器
爲了讓admin組件能管理某個數據模型,首先咱們須要建立模型。爲方便後續測試,建立以下模型:session
# [app name]/models.py from django.db import models class Publisher(models.Model): title = models.CharField(max_length=32) def __str__(self): return self.title class Author(models.Model): name = models.CharField(max_length=32) age = models.IntegerField(null=True) def __str__(self): return self.name class Book(models.Model): title = models.CharField(max_length=32) publishDate = models.DateField(null=True) price = models.DecimalField(max_digits=5, decimal_places=2) publisher = models.ForeignKey(to=Publisher) authors = models.ManyToManyField(to=Author) def __str__(self): return self.title
而後在admin組件中註冊模型,便可在Admin中實現增刪改查的功能:app
# [app name]/admin.py from django.contrib import admin from img_upload import models admin.site.register(models.Book)
效果以下:ide
上述方式比較簡單,若是想要進行更多的定製操做,須要利用ModelAdmin進行操做,如:函數
# 方式一 from django.contrib import admin from img_upload import models @admin.register(models.Book) class UserAdmin(admin.ModelAdmin): list_display = ('title', 'price')
# 方式二 from django.contrib import admin from img_upload import models class BookAdmin(admin.ModelAdmin): list_display = ('title', 'price') admin.site.register(models.Book, UserAdmin)
ModelAdmin中提供了大量的可定製功能,以下:
讓列表顯示指定的列。
class BookAdmin(admin.ModelAdmin): list_display = ('title', 'price')
列表時,讓指定列能夠點擊跳轉到編輯頁。
class BookAdmin(admin.ModelAdmin): list_display = ('title', 'price') list_display_links = ('price',)
列表時,讓指定列內容去重後出如今右側,點擊便可篩選內容。
class BookAdmin(admin.ModelAdmin): list_display = ('title', 'price') list_filter= ['title']
設置連表查詢是否自動select_related。
class BookAdmin(admin.ModelAdmin): list_select_related = True
讓指定列可在列表時進行編輯。
class BookAdmin(admin.ModelAdmin): list_editable = ['price']
列表頁下,搜索時按指定列模糊查詢。
class BookAdmin(admin.ModelAdmin): search_fields = ('title', 'price')
列表時,列表左上方會顯示一個日期層級導航欄,可經過點擊對Date和DateTime類型進行過濾。
class BookAdmin(admin.ModelAdmin): date_hierarchy = 'publishDate'
詳細頁面,若是有其餘表和當前表作FK關聯,那麼詳細頁面能夠對那些表進行動態增長和刪除。
from django.contrib import admin from img_upload import models class BookInline(admin.StackedInline): extra = 0 # 可指定編輯頁初始新增框的個數 model = models.Book class BookAdmin(admin.ModelAdmin): date_hierarchy = 'publishDate' list_display = ('title', 'price', 'publishDate') list_filter = ['title'] class PublisherAdmin(admin.ModelAdmin): inlines = [BookInline] admin.site.register(models.Book, BookAdmin) admin.site.register(models.Publisher, PublisherAdmin)
列表時,定製action中的操做。
class BookAdmin(admin.ModelAdmin): date_hierarchy = 'publishDate' list_display = ('title', 'price', 'publishDate') list_filter = ['title'] # 定製Action行爲具體方法 def func(self, request, queryset): print(self, request, queryset) print(request.POST.getlist('_selected_action')) func.short_description = "自定義Action顯示的名稱" actions = [func, ] # Action選項在頁面上方顯示 actions_on_top = True # Action選項在頁面下方顯示 actions_on_bottom = True # 是否顯示選擇個數 actions_selection_counter = True
add_form_template = None change_form_template = None change_list_template = None delete_confirmation_template = None delete_selected_confirmation_template = None object_history_template = None
詳細頁面,指定的外鍵字段以Input框形式顯示。
class BookAdmin(admin.ModelAdmin): list_display = ('title', 'price', 'publishDate') raw_id_fields = ('publisher',)
詳細頁時,只顯示指定的字段。
class BookAdmin(admin.ModelAdmin): fields = ('title',)
詳細頁時,指定的字段不顯示。
class BookAdmin(admin.ModelAdmin): exclude = ('price',)
詳細頁時,指定的字段只讀不可編輯。
class BookAdmin(admin.ModelAdmin): readonly_fields = ('price',)
詳細頁時,使用fieldsets標籤對數據進行分組顯示。
class BookAdmin(admin.ModelAdmin): fieldsets = ( ('基本數據', { 'fields': ('title',) }), ('其餘', { 'classes': ('collapse', 'wide', 'extrapretty'), # 應用一些Django內置的樣式到該組 'fields': ('price',) }), )
詳細頁面時,設置ManyToManyFieldx選擇框所在位置(上下和左右)。
class BookAdmin(admin.ModelAdmin): filter_horizontal = ("authors",)
class BookAdmin(admin.ModelAdmin): ordering = ("-price",) # 或 def get_ordering(self, request): return ['-price', ]
詳細頁時,使用radio顯示外鍵選項(默認使用select)。
class BookAdmin(admin.ModelAdmin): radio_fields = {"publisher": admin.VERTICAL} # 或admin.HORIZONTAL
設置列數據爲空時顯示的默認值。
class AuthorAdmin(admin.ModelAdmin): empty_value_display = "列數據爲空時,默認顯示" def view_age(self): return self.age view_age.empty_value_display = '年齡爲空' list_display = ('name', 'age', view_age)
首先在django.contrib.apps.py文件中能夠看到以下代碼:
23行代碼將會在admin組件加載完畢後執行,下面咱們看一下這個autodiscover函數作了什麼?
它其實是間接調用了django.contrib.admin.__init__.py中的autodiscover函數,而這個函數的做用就是加載每個app下的admin.py文件。而咱們在使用admin組件時,會在admin.py文件下將模型註冊到admin.site中,以下:
而找到site的出處咱們會發現,site實際上是AdminSite類的一個實例,而咱們是經過模塊導入使用site,因此site實際上是一個單例對象,以下:
再觀察剛調用的register函數作了什麼?
從88行能夠看到,register函數其實是把咱們傳入的模型類當作key,admin_class類(也就是定製admin時使用的ModelAdmin類)的實例做爲值,放入到本身這個單例對象的名爲_registry的字典中。換言之,在_registry字典屬性中,每一個key都是咱們註冊的模型類,而每一個模型類對應一個admin_class類的實例做爲其值。到此模型註冊完成。
接下來咱們看一下使用admin組件的路由:
看到這裏你會不會想到,爲何這裏只配置了一個路由,而咱們在使用admin組件時卻能夠訪問那麼多的url。來看一下admin.site.urls:
由243行能夠發現admin.site.urls返回了一個元組,而經過以前路由章節的學習已經知道,這其實也是一種分發方式。咱們繼續看get_urls函數:
在219~224行能夠看到,這裏在遍歷咱們以前註冊過模型的字典,並根據admin組件自定的規則,生成一個包含路由和視圖信息的url列表並返回。