python框架之Django(13)-admin組件

使用

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

admin的定製

上述方式比較簡單,若是想要進行更多的定製操做,須要利用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中提供了大量的可定製功能,以下:

  • list_display

    讓列表顯示指定的列。

    class BookAdmin(admin.ModelAdmin):
        list_display = ('title', 'price')
  • list_display_links

    列表時,讓指定列能夠點擊跳轉到編輯頁。

    class BookAdmin(admin.ModelAdmin):
        list_display = ('title', 'price')
        list_display_links = ('price',)
  • list_filter

    列表時,讓指定列內容去重後出如今右側,點擊便可篩選內容。

    class BookAdmin(admin.ModelAdmin):
        list_display = ('title', 'price')
        list_filter= ['title']
  • list_select_related

    設置連表查詢是否自動select_related。

    class BookAdmin(admin.ModelAdmin):
        list_select_related = True
  • list_editable

    讓指定列可在列表時進行編輯。

    class BookAdmin(admin.ModelAdmin):
        list_editable = ['price']
  • search_fields

    列表頁下,搜索時按指定列模糊查詢。

    class BookAdmin(admin.ModelAdmin):
        search_fields = ('title', 'price')
  • date_hierarchy

    列表時,列表左上方會顯示一個日期層級導航欄,可經過點擊對Date和DateTime類型進行過濾。

    class BookAdmin(admin.ModelAdmin):
        date_hierarchy = 'publishDate'
  • inlines

    詳細頁面,若是有其餘表和當前表作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

    列表時,定製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

    自定義html模板

        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
  • raw_id_fields

    詳細頁面,指定的外鍵字段以Input框形式顯示。

    class BookAdmin(admin.ModelAdmin):
        list_display = ('title', 'price', 'publishDate')
        raw_id_fields = ('publisher',)
  • fields

    詳細頁時,只顯示指定的字段。

    class BookAdmin(admin.ModelAdmin):
        fields = ('title',)
  • exclude

    詳細頁時,指定的字段不顯示。

    class BookAdmin(admin.ModelAdmin):
        exclude = ('price',)
  • readonly_fields

    詳細頁時,指定的字段只讀不可編輯。

    class BookAdmin(admin.ModelAdmin):
        readonly_fields = ('price',)
  • fieldsets

    詳細頁時,使用fieldsets標籤對數據進行分組顯示。

    class BookAdmin(admin.ModelAdmin):
        fieldsets = (
            ('基本數據', {
                'fields': ('title',)
            }),
            ('其餘', {
                'classes': ('collapse', 'wide', 'extrapretty'), # 應用一些Django內置的樣式到該組
                'fields': ('price',)
            }),
        )
  • filter_vertical&filter_horizontal

    詳細頁面時,設置ManyToManyFieldx選擇框所在位置(上下和左右)。

    class BookAdmin(admin.ModelAdmin):
        filter_horizontal = ("authors",)
  • ordering

    列表時,設置列表初加載時的排序規則(字段及正反序)。
    class BookAdmin(admin.ModelAdmin):
        ordering = ("-price",)
    
        #
        def get_ordering(self, request):
            return ['-price', ] 
  • radio_fields

    詳細頁時,使用radio顯示外鍵選項(默認使用select)。

    class BookAdmin(admin.ModelAdmin):
        radio_fields = {"publisher": admin.VERTICAL}  # 或admin.HORIZONTAL
  • empty_value_display

    設置列數據爲空時顯示的默認值。

    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列表並返回。

相關文章
相關標籤/搜索