細說Django的admin
在admin.py中只需要將地Model中某個類注冊,即可在Admin中進行增刪查改的功能,例如:
admin.site.register(models.UserInfo)
這種方式比較簡單,如果想要進行更多的定制操作,就需要利用ModelAdmin進行操作
方式一
from django.contrib import admin
from . import models
class BookAdmin(admin.ModelAdmin):
list_display = ('title','price','publish')
admin.site.register(models.Book,BookAdmin)
沒有設定BookAdmin時,系統默認為ModelAdmin
models.Book實際上是一個串列,也可以寫成
from django.contrib import admin
from . import models
class BookAdmin(admin.ModelAdmin):
list_display = ('title','price','publish')
admin.site.register([models.Book,],BookAdmin)
這個引數里可以寫多個表名,但要注意的是這里面添加的表名都必須要有list_display中宣告要顯示的欄位
方式二
from django.contrib import admin
from . import models
@admin.register(models.Book)
class BookAdmin(admin.ModelAdmin):
list_display = ('title','price','publish')
在ModelAdmin中提供了大量的可定制的功能
定制admin
1.list_display:顯示串列時,定制顯示的列
from django.contrib import admin
from . import models
@admin.register(models.Book)
class BookAdmin(admin.ModelAdmin):
list_display = ('title','price','publish')
在后臺管理頁面中,顯示書的名稱,價格以及出版社等資訊

在class類中還有如下用法:
from django.contrib import admin
from . import models
@admin.register(models.Book)
class BookAdmin(admin.ModelAdmin):
list_display = ('title','price','aaa')
def aaa(self,obj):
return obj.title+"--aaaa"
顯示如下

2.list_display_links:串列時,定制列可以點擊跳轉
from django.contrib import admin
from . import models
@admin.register(models.Book)
class BookAdmin(admin.ModelAdmin):
list_display = ('title','price','publish')
list_display_links = ('title','price','publish')
在后臺頁面顯示的時候,所顯示的列為可以點擊跳轉

3.list_filter:串列時,定制右側快速篩選
例子一:
from django.contrib import admin
from . import models
@admin.register(models.Book)
class BookAdmin(admin.ModelAdmin):
list_display = ('title','price','publish')
list_filter = ('classification','publish')
效果如下:

例子二:
from django.contrib import admin
from . import models
@admin.register(models.Book)
class BookAdmin(admin.ModelAdmin):
list_display = ('title','price','publish')
class Ugg(admin.SimpleListFilter):
title=uget('型別')
parameter_name = "book"
def lookups(self, request, model_admin):
"""
顯示篩選選項,列出價格大于100的書箱的型別
:param request:
:param model_admin:
:return:
"""
return models.Book.objects.filter(price__gt=100).values_list("publish","classification")
def queryset(self, request, queryset):
"""
點擊查詢時,進行篩選
:param request:
:param queryset:
:return:
"""
v1=self.value()
return queryset
list_filter = ["publish",Ugg,]
效果如下:

4.list_select_related:串列時,連表查詢是否自動select_related
使用聯表查詢可以提高資料庫的查詢性能
from django.contrib import admin
from . import models
@admin.register(models.Book)
class BookAdmin(admin.ModelAdmin):
list_display = ('title','price','publish')
list_select_related = ["publish"] # 聯表查詢出版社的資訊
5. 分頁相關
list_per_page=10 # 分頁,每頁顯示的資料條數
list_max_show_all=100 # 分頁,顯示全部資料時,最多顯示的資料條數
paginator=Paginator # 分布插件
例如:
from django.contrib import admin
from . import models
@admin.register(models.Book)
class BookAdmin(admin.ModelAdmin):
list_display = ('title','price','publish')
list_per_page = 2
效果如下:

6. list_editable:串列時,可以編輯的列
from django.contrib import admin
from . import models
@admin.register(models.Book)
class BookAdmin(admin.ModelAdmin):
list_display = ('title','price','publish')
list_editable = ('price','publish')
效果如下:

7. search_fields:串列時,模糊搜索的功能
from django.contrib import admin
from . import models
@admin.register(models.Book)
class BookAdmin(admin.ModelAdmin):
list_display = ('title','price','publish')
list_select_related = ["publish"]
search_fields = ['title','classification']
效果如下:

8. date_hierarchy:串列時,對Date和DateTime型別進行搜索
from django.contrib import admin
from . import models
@admin.register(models.Book)
class BookAdmin(admin.ModelAdmin):
list_display = ('title','price','publish','publication_date')
list_select_related = ["publish"]
date_hierarchy="publication_date"
效果如下:


9. preserve_filters:詳細頁面,洗掉、修改,更新后跳轉回串列后,是否保留原搜索條件
from django.contrib import admin
from . import models
@admin.register(models.Book)
class BookAdmin(admin.ModelAdmin):
list_display = ('title','price','publish','publication_date')
list_select_related = ["publish"]
search_fields = ['title', 'classification']
preserve_filters=True
效果如下:

10. save_as = False:詳細頁面,按鈕為“Save as new” 或 “Save and add another”
from django.contrib import admin
from . import models
@admin.register(models.Book)
class BookAdmin(admin.ModelAdmin):
list_display = ('title','price','publish','publication_date')
list_select_related = ["publish"]
save_as = True
效果如下:

from django.contrib import admin
from . import models
@admin.register(models.Book)
class BookAdmin(admin.ModelAdmin):
list_display = ('title','price','publish','publication_date')
list_select_related = ["publish"]
save_as = False
效果如下:

11. save_as_continue = True:點擊保存并繼續編輯
用法與上一個用法相同
12. save_on_top = False:詳細頁面,在頁面上方是否也顯示保存洗掉等按鈕
from django.contrib import admin
from . import models
@admin.register(models.Book)
class BookAdmin(admin.ModelAdmin):
list_display = ('title','price','publish','publication_date')
list_select_related = ["publish"]
save_on_top = False
效果如下:

from django.contrib import admin
from . import models
@admin.register(models.Book)
class BookAdmin(admin.ModelAdmin):
list_display = ('title','price','publish','publication_date')
list_select_related = ["publish"]
save_on_top = True
效果如下:

13. inlines:詳細頁面,如果有其他表和當前表做FK,那么詳細頁面可以進行動態增加和洗掉
from django.contrib import admin
from . import models
@admin.register(models.Book)
class BookAdmin(admin.ModelAdmin):
list_display = ('title','price')
class BookInline(admin.StackedInline):
extra=0
model=models.Book
class PublishAdmin(admin.ModelAdmin):
inlines = [BookInline,]
list_display = ['name','addr']
admin.site.register(models.Publish,PublishAdmin)
效果如下:

在編輯或添加出版社的時候可以同時添加多本書箱資料,添加書籍資訊的時候是縱向添加書籍資訊的
在這里BookInline這個類還可以繼承TabularInline這個類實作橫向添加書籍資訊
from django.contrib import admin
from . import models
@admin.register(models.Book)
class BookAdmin(admin.ModelAdmin):
list_display = ('title','price')
class BookInline(admin.TabularInline):
extra=0
model=models.Book
class PublishAdmin(admin.ModelAdmin):
inlines = [BookInline,]
list_display = ['name','addr']
admin.site.register(models.Publish,PublishAdmin)
效果如下:

14. action:串列時,定制action中的操作
from django.contrib import admin
from . import models
@admin.register(models.Book)
class BookAdmin(admin.ModelAdmin):
list_display = ('title','price')
def func1(self,request,queryset): # 定義具體的action的方法
pass
func1.short_description = "自定義操作" # 在頁面上顯示方法的名稱
actions_on_top = True # action在頁面上方顯示
actions_on_bottom = False # action在頁面下方顯示
actions_selection_counter = True # 顯示頁面上選擇資料的條數
actions=[func1,] # 添加定制的action的操作
在action串列中,添加一個func1的功能

15. 定制HTML模板
Django后臺管理頁面默認使用的模板是change_list.html

打開change_list.html頁面,添加一行
<h3>hello python</h3>
重繪瀏覽器,可以看到

可以設定的選項有:
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 # 有ForeignKey時關聯資料進行處理的模板
例子:
from django.contrib import admin
from . import models
@admin.register(models.Book)
class BookAdmin(admin.ModelAdmin):
list_display = ('title','price')
change_list_template = ['change_list1.html']
效果如下:

16. raw_id_fields:詳細頁面,針對FK和M2M欄位變成以Input框形式
正常顯示的時候,FK和M2M欄位是通過下拉框來進行操作的
添加raw_id_fields配置后,針對FK和M2M欄位變成以Input框形式
from django.contrib import admin
from . import models
@admin.register(models.Book)
class BookAdmin(admin.ModelAdmin):
list_display = ('title','price','classification')
raw_id_fields = ('publish','authors')
效果如下:


17. fields:詳細頁面時,顯示的欄位
from django.contrib import admin
from . import models
@admin.register(models.Book)
class BookAdmin(admin.ModelAdmin):
fields = ('title','price')
效果如下:

18. exclude:詳細頁面時,排除的欄位
from django.contrib import admin
from . import models
@admin.register(models.Book)
class BookAdmin(admin.ModelAdmin):
exclude = ('classification',)
效果如下:

19. readonly_fields:詳細頁面時,只讀欄位
from django.contrib import admin
from . import models
@admin.register(models.Book)
class BookAdmin(admin.ModelAdmin):
readonly_fields = ('classification',)
效果如下:

20. fieldsets:詳細頁面時,使用fieldsets標簽對資料進行分割顯示
from django.contrib import admin
from . import models
@admin.register(models.Book)
class BookAdmin(admin.ModelAdmin):
fieldsets = (
("基本資訊",{
"fields":("title","price","publish",)
}),
("出版資訊",{
"classes":("collapse","wide","extrapretty"),
"fields":("classification","authors","publication_date",)
}),
)
效果如下:


21. 詳細頁面時,M2M顯示時,資料移動選擇(方向:上下和左右)
from django.contrib import admin
from . import models
@admin.register(models.Book)
class BookAdmin(admin.ModelAdmin):
filter_vertical = ("authors",)
效果如下:

from django.contrib import admin
from . import models
@admin.register(models.Book)
class BookAdmin(admin.ModelAdmin):
filter_horizontal = ("authors",)
效果如下:

22. ordering:串列時,資料排序規則
from django.contrib import admin
from . import models
@admin.register(models.Book)
class BookAdmin(admin.ModelAdmin):
list_display = ("title","price","classification","publish")
ordering=("-price",)
效果如下:

from django.contrib import admin
from . import models
@admin.register(models.Book)
class BookAdmin(admin.ModelAdmin):
list_display = ("title","price","classification","publish")
ordering=("price",)
效果如下:

23. view_on_site:編輯時,是否在頁面上顯示view on set
from django.contrib import admin
from . import models
@admin.register(models.Book)
class BookAdmin(admin.ModelAdmin):
list_display = ("title","price","classification","publish")
def view_on_site(self,obj):
return "http://www.baidu.com"
點擊view on set按鈕,瀏覽器會指向"http://www.baidu.com"

24. radio_fields:詳細頁面時,使用radio顯示選項(FK默認使用select)
from django.contrib import admin
from . import models
@admin.register(models.Book)
class BookAdmin(admin.ModelAdmin):
list_display = ("title","price","classification","publish")
radio_fields = {"publish":admin.VERTICAL}
效果如下:

25. show_full_result_count = True:串列時,模糊搜索后面顯示的資料個數樣式
from django.contrib import admin
from . import models
@admin.register(models.Book)
class BookAdmin(admin.ModelAdmin):
list_display = ("title","price","classification","publish")
search_fields = ('title','classification')
show_full_result_count = True
效果如下:

26. formfield_overrides = {}:詳細頁面時,指定現實插件
27. prepopulated_fields = {}:添加頁面,當在某欄位填入值后,自動會將值填充到指定欄位
from django.contrib import admin
from . import models
@admin.register(models.Book)
class BookAdmin(admin.ModelAdmin):
list_display = ("title","price","classification","publish")
search_fields = ('title','classification')
prepopulated_fields = {"title":("classification",)}
效果如下:

28. form = ModelForm:用于定制用戶請求時候表單驗證
未進行配置之前:

修改組態檔:
from django.contrib import admin
from . import models
from django.forms import ModelForm
class MyForm(ModelForm):
class Meta:
model=models.Book
fields="__all__"
error_messages = {
"title": {'required': "書名不能為空"},
"price": {'required': "價格不能為空"}
} # 自定義錯誤資訊,用戶輸入錯誤時顯示
@admin.register(models.Book)
class BookAdmin(admin.ModelAdmin):
list_display = ("title","price","classification","publish")
search_fields = ('title','classification')
form=MyForm
效果如下:

29. empty_value_display = "列資料為空時,顯示默認值"
from django.contrib import admin
from . import models
@admin.register(models.Book)
class BookAdmin(admin.ModelAdmin):
list_display = ("title","price","classification","publish")
search_fields = ('title','classification')
empty_value_display="列資料為空時,默認顯示"
總結:
- 在定制admin的所有的操作的時候都是在組態檔中完成的.
- 在組態檔中,可以進行配置的有資料表的欄位,函式和類
- 在某個頁面中,可以配置使用自定義的模板.
- 同樣的,請求到達Django的時候,也可以配置使其執行自定義的函式
ModelAdmin是放置在options.py檔案中的.
打開options.py檔案,可以看到ModelAdmin里有一個叫做changelist_view的方法
from django.contrib import admin
from . import models
@admin.register(models.Book)
class BookAdmin(admin.ModelAdmin):
list_display = ("title","price","classification","publish")
search_fields = ('title','classification')
empty_value_display="列資料為空時,默認顯示"
可以看到,BookAdmin是繼承自ModelAdmin這個類的,ModelAdmin里有一個changelist_view 的方法
所以在BookAdmin中也可以自定義一個changelist_view的視圖函式.
自定義了changelist_view后,changelist_view這個方法只能對BookAdmin類生效,對別的類不起作用
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/131500.html
標籤:Python
上一篇:制作透視表
下一篇:Python之爬蟲小例子
