在前面文章python之Django學習筆記(二)---Django從工程創建、app創建到表建模在頁面的顯示中已經提到了注冊表就是在admin.py中完成
已經涉及的修改是list_display,表示在界面顯示哪些列,下面記錄涉及到常用的后台操作
1、注冊表
表必須在admin.py中注冊后才能在界面上顯示,所以注冊表時第一步,一般代碼如下:
from django.contrib import admin from djangoTestApp.models import Student,Score#導入表 # Register your models here. admin.site.register(Student) admin.site.register(Score)
上面代碼把之前建的3張表都注冊了
2、列表中顯示列(list_display)
之前講過,就是在模型管理中使用list_display顯示
from django.contrib import admin from djangoTestApp.models import Student,Score # Register your models here. class StudentAdmin(admin.ModelAdmin): list_display = ('NameNo','Sex','Age',)class ScoreAdmin(admin.ModelAdmin): list_display = ('No','Name','Course','Score') admin.site.register(Student,StudentAdmin) admin.site.register(Score,ScoreAdmin)
上面創建的樣式類需要繼承admin.ModelAdmin類,名稱一般都是表名+Admin
一般情況下,如果有相同的名稱時,list_display按照下面順序解釋元素:
★模型中表的字段
★callabled類型(自定義 函數)
★ModelAdmin屬性
★模型屬性
3、編輯時顯示列(fields)
即在增加or編輯界面顯示fields中的字段,如下為當前Student表在編輯界面展示的字段:
上面左圖為增加界面,右圖為修改界面,顯示了Student的4個字段
在admin.py中加上fields字段只顯示學號、姓名和年齡,如下:
class StudentAdmin(admin.ModelAdmin): list_display = ('NameNo','Sex','Age') fields = ('No','Name','Age')#編輯界面只顯示No、Name和Age
這樣在編輯界面只有這三個字段,少了‘性別’:
fields還有調整列的順序的功能,比如把No和Name對調一下
class StudentAdmin(admin.ModelAdmin): list_display = ('NameNo','Sex','Age') fields = ('Name','No','Age',)#No和Name順序對調
在界面上顯示如下:
如上圖,學號和姓名已經調整了位置。
fields還有使字段分布在同一行的功能,直到一行滿了為止。比如說要把姓名和學號放到一排,那么可以如下:
class StudentAdmin(admin.ModelAdmin): list_display = ('NameNo','Sex','Age') fields = (('Name','No',),'Age',)#Name和No一組,在同一行顯示
界面上如下圖所示:
4、編輯時不顯示列(exclude)
同fields字段相反,在exclude中的字段將不會顯示。使用時不要把fields和exclude同時使用
同上,如果不需要顯示Sex字段,也可以直接寫成如下,效果是一樣的
class StudentAdmin(admin.ModelAdmin): list_display = ('NameNo','Sex','Age') #fields = ('No','Name','Age',) exclude = ('Sex',)#記得元祖需要在后面加個逗號,不然會報錯
5、編輯時頁面布局(fieldsets)
比如說把No和Name作為‘基本信息’字段集,把Age和Sex作為‘高級信息’字段集,代碼可以做如下調整
class StudentAdmin(admin.ModelAdmin): list_display = ('NameNo','Sex','Age') #fields = (('Name','No',),'Age',) #exclude = ('Sex',) fieldsets = ( ('基本信息',{ 'fields':('No','Name',), }, ), ('高級信息',{ 'fields':('Sex','Age',), } ) )
說明下fields和fieldsets不能同時存在,系統會報錯導致打不開。
上面代碼在界面上展示樣式如下:
如果不需要‘基本信息’這一行,可以在fieldsets中把‘基本信息’修改為None:
class StudentAdmin(admin.ModelAdmin): list_display = ('NameNo','Sex','Age') #fields = (('Name','No',),'Age',) #exclude = ('Sex',) fieldsets = ( (None,{#不顯示 'fields':('No','Name',), }, ), ('高級信息',{'fields':('Sex','Age',), } ) )
界面展示如下:
也可以把不重要的信息折疊起來,這時會用到字段集的參數classes,如下把高級信息折疊起來:
class StudentAdmin(admin.ModelAdmin): list_display = ('NameNo','Sex','Age') #fields = (('Name','No',),'Age',) #exclude = ('Sex',) fieldsets = ( (None,{ 'fields':('No','Name',), }, ), ('高級信息',{ 'classes':('collapse',),#把‘高級信息’默認折疊起來 'fields':('Sex','Age',), } ) )
在界面上展示如下,可以通過點擊‘show’展開:
classes還有另外一個樣式:wide,即字段填寫有更大的控件。
字段集還有屬性description,即描述,如果帶有此屬性,則會顯示在 字段集下方,如下:
class StudentAdmin(admin.ModelAdmin): list_display = ('NameNo','Sex','Age') #fields = (('Name','No',),'Age',) #exclude = ('Sex',) fieldsets = ( (None,{ 'fields':('No','Name',), }, ), ('高級信息',{ 'classes':('collapse',), 'description':'這里是高級信息的內容',#描述的內容 'fields':('Sex','Age',), } ) )
在界面上展示如下:
6、編輯時樣式字段(form)
可以通過django.forms來定義不同的樣式,然后在模型管理中調用這個樣式,如下在admin.py中定義一個樣式
from django import forms#導入樣式類 class StudentForm(forms.ModelForm): class Meta: exclude = ('Sex',)
上面代碼就是讓表Student不顯示Age這個列,然后在StudentAdmin類中調用這個樣式
class StudentAdmin(admin.ModelAdmin): list_display = ('NameNo','Sex','Age') #fields = (('Name','No',),'Age',) #exclude = ('Sex',) form = StudentForm#調用自定義樣式,之前的fieldsets注釋掉
上面這樣調用和在模型管理中調用exclude效果是一樣的,但若模型管理中也有exclude,那么優先使用模型管理中的。
這個規則同樣適用於其他樣式比如fields、fieldsets等
7、字段樣式(format_html)
在前面學習過字段聚合顯示,這里的字段樣式和之前差不多,比如把性別按照male和female分別顯示藍色和紅色,具體操作如下
▲在models.py的Student表中增加如下代碼:
from django.utils.html import format_html class Student(models.Model): No = models.CharField('學號',max_length = 10) Name = models.CharField('姓名',max_length = 20) Sex = models.CharField('性別',max_length = 1,choices = SEX_CHOICE,default = 'M') Age = models.IntegerField('年齡') def colored(self):#定義顯示的顏色,male顯示藍色,female顯示紅色 if self.Sex == 'M': html = '<span style="color: #0000FF;">{}</span>' else: html ='<span style="color: #FF0000;">{}</span>' return format_html( html, self.Sex, ) colored.short_description = '性別' Sex_color = colored
▲在admin.py中修改展示的列
class StudentAdmin(admin.ModelAdmin): list_display = ('NameNo','Sex_color','Age',)
這時刷新頁面,展示效果如下:
8、非表字段可排序(admin_order_field)
通過字段樣式設置的字段,在展示后無法排序(即無法通過點擊字段名排序),這里可以通過指定字段來排序
(多個字段組合也可以指定,通過property裝飾的字段都不能參與排序)
在models.py中增加一行如下代碼:
class Student(models.Model): No = models.CharField('學號',max_length = 10) Name = models.CharField('姓名',max_length = 20) Sex = models.CharField('性別',max_length = 1,choices = SEX_CHOICE,default = 'M') Age = models.IntegerField('年齡') #Color = models.CharField(max_length = 6,default='FF0000') def colored(self): if self.Sex == 'M': html = '<span style="color: #0000FF;">{}</span>' else: html ='<span style="color: #FF0000;">{}</span>' return format_html( html, #self.Color, self.Sex, ) colored.short_description = '性別' colored.admin_order_field = 'Sex'#指定Sex可以參與排序 Sex_color = colored
刷新展示頁面后就可以點擊‘性別’字段排序了,當然也可以指定點擊第一次以反序排列,只要在Sex前加‘-’即可,如下
colored.admin_order_field = '-Sex'#指定Sex可以參與排序,先反序
9、字段鏈接到編輯界面(list_display_links)
在沒有list_display_links字段時,默認情況list_displapy中第一個字段具有鏈接到編輯界面,如果需要其他字段鏈接到編輯界面,則可以使用此字段,如下設置
class StudentAdmin(admin.ModelAdmin): def Age(self,obj): return 'xxx' list_display = ('NameNo','Sex_color','Age',) list_display_links = ('Age',)#設置年齡字段可鏈接到編輯界面
刷新界面即可看到Age字段上的數據可以點擊進入編輯界面:
當然也可以設置所有字段都不可以點擊進入編輯頁面,只要設置為None即可
class StudentAdmin(admin.ModelAdmin): def Age(self,obj): return 'xxx' list_display = ('NameNo','Sex_color','Age',) list_display_links = None#所有字段都不可點擊進入編輯頁面
10、列表可編輯字段(list_editable)
list_editable允許表字段可以在列表中直接進行編輯,也可以一次編輯多條數據,如下:
class StudentAdmin(admin.ModelAdmin): list_display = ('NameNo','Sex_color','Age',) list_display_links = None list_editable = ('Age',)#年齡字段在列表界面可直接編輯
刷新界面后,樣式如下:
可以看到年齡字段可以直接進行編輯,無需再到編輯界面一個個編輯。
使用list_editable有幾個限制:
★list_editable中字段必須在list_display中
★list_editable中字段不能在list_display_links中,如果沒有list_display_links則不能為list_display的第一個字段(也就是可鏈接到編輯界面的字段,無法在列表頁直接編輯)
★list_editable不能設置非模型中表字段,也就是必須為原始表中的字段才可以設置
11、過濾器(list_filter)
顯示在列表右側的過濾器,算是快捷的過濾方法,一般用作boolean或者有限的值,如下
class StudentAdmin(admin.ModelAdmin): list_display = ('NameNo','Sex_color','Age',) list_filter = ('Age',)#設置Age為過濾列 list_display_links = None list_editable = ('Age',)
刷新頁面后如下所示:
說明:非模型中原始表的列不能作為過濾對象
list_filter還有種寫法如下,感覺效果是一樣的:
list_filter = (('Sex',admin.ChoicesFieldListFilter,),)
字段Sex是Choice類型,所以也可以這么寫,當然還有其他類型如:RelatedFieldListFilter、BooleanFieldListFilter、ChoicesFieldListFilter、DateFieldListFilter等
12、最多顯示個數(list_max_show_all)
在這個版本沒看出來作用
13、每頁顯示條數(list_per_page)
我們設置list_per_page=4(默認100),那么Student中的6條數據會顯示為倆頁
class StudentAdmin(admin.ModelAdmin): list_display = ('NameNo','Sex_color','Age',) list_filter = ('Age',) list_per_page = 4#每頁顯示4條數據 list_max_show_all = 2 list_display_links = None list_editable = ('Age',)
刷新頁面后顯示如下:
14、按照列排序(ordering)
這個是進入表之后的排序,如果不設置,則默認按照數據錄入順序排列
class StudentAdmin(admin.ModelAdmin): list_display = ('NameNo','Sex','Age',) list_filter = ('Age',) ordering = ('-Age',)#年齡按照從大到小排列 list_per_page = 10 list_max_show_all = 2 list_display_links = None list_editable = ('Age',)
15、編輯時顯示為只讀(readonly_fields)
即在編輯界面,設置的字段為只讀,不可編輯。對非模型表原始字段也生效,若readonly_fields設置了非模型字段,則會在編輯界面顯示,否則不顯示
class StudentAdmin(admin.ModelAdmin): list_display = ('NameNo','Sex_color','Age',) readonly_fields = ('Sex','NameNo')#設置性別、姓名(學號)為只讀
刷新界面后 顯示如下:
說明:在列表界面設置可編輯(list_editable)不沖突,倆邊都可以自行設置為是否可編輯
16、保存為新記錄並停留在編輯界面(save_as)
默認save_as=False,此時編輯界面有三個按鈕:保存並新增、保存繼續編輯、保存並跳轉到列表頁。
修改為True之后,保存並新增選項會修改為保存為新紀錄並跳轉到新紀錄的編輯界面,如下:
class StudentAdmin(admin.ModelAdmin): list_display = ('NameNo','Sex_color','Age',) save_as = True#保存為新紀錄
操作如下:
17、保存為新紀錄並跳轉到列表頁(save_as_continue)
默認值為True,即保存並新增按鈕會跳轉到編輯頁面,若為False則跳轉到列表頁面(只針對sava_as=True時生效)
class StudentAdmin(admin.ModelAdmin): list_display = ('NameNo','Sex_color','Age',) save_as_continue = False#跳轉到列表頁面 save_as = True
18、在編輯界面頂部設置保存、刪除按鈕(save_on_top)
默認為False,也就是在編輯界面保存、刪除按鈕都是在底部。若設置為True,保存、刪除按鈕也會存在頂部(底部按鈕仍在)
class StudentAdmin(admin.ModelAdmin): list_display = ('NameNo','Sex_color','Age',) save_on_top = True#設置刪除、保存按鈕在頂部
19、搜索框(search_fields)
默認是沒有搜索框的,需要設置。在search_fields中的字段(必須為模型表字段)必須在list_display中存在(不一定為模型表字段),如下:
class StudentAdmin(admin.ModelAdmin): list_display = ('NameNo','Sex_color','Age') search_fields = ('Name',)#搜索姓名字段
默認情況搜索框是按照queryset中icontains進行查詢,若需要精確查詢等,可以在字段上加對應的條件,如,需要精確查詢姓名:
search_fields = ('Name__exact',)#雙下划線,精確查詢姓名
其他基本和queryset中filter類似,具體可以查看filter()方法
20、是否在搜索框右側顯示列表總數(show_full_result_count)
默認為True,即顯示總數,如下所示:
若設置為False
class StudentAdmin(admin.ModelAdmin): list_display = ('NameNo','Sex_color','Age') show_full_result_count = False#設置不顯示總數,只顯示‘show all’
則如下效果:
和總數一樣,show all也可以點擊,然后顯示所有記錄
21、設置列表頁中的列表可排序(sortable_by)
默認情況下模型表字段都可以排序,之前admin_order_field字段是讓非模型表字段可排序。
這里的sortable_by的的優先級高於admin_order_field。
若sortable_by設置為空集,則所有字段都不可以排序。sortable_by可以把所有字段(包括非模型表字段)設置為可排序
如設置NameNo設置為可排序:
class StudentAdmin(admin.ModelAdmin): list_display = ('NameNo','Sex_color','Age') sortable_by = ('NameNo',)#設置NameNo字段可排序
這時其他字段都不可以排序。
22、編輯頁面右上角鏈接(view_on_site)
默認True,使用get_absolute_url來顯示(若沒有則不顯示)。若為False,則不會顯示。
當然也可以自定義view_on_site為callable,這樣就可以顯示對應返回的url,如下:
class StudentAdmin(admin.ModelAdmin): list_display = ('NameNo','Sex_color','Age') def view_on_site(self, obj): return 'http://www.cnblogs.com/watertaro'#在編輯界面右上角顯示主頁
刷新頁面編輯界面如下:
23、按時間搜索(date_hierarchy):
只針對date或datetime類型數據,會在search_fields和Action之間出現一個按照時間搜索的插件
在models.py中增加一張表Books:
class Books(models.Model): No = models.CharField('編號',max_length = 10) Name = models.CharField('書名',max_length = 20) CreateTime = models.DateTimeField('創建時間',auto_now_add=True) UpdateTime = models.DateTimeField('更新時間',auto_now=True) def __str__(self): return 'No:' + self.No + ';TeacherName:' + self.Name + ';CreateTime:' + str(self.CreateTime)
加完表之后在命令行中執行:
python manage.py makemigrations#生成表改動文件 python manage.py migrate#修改表
在admin.py中增加如下代碼:
from djangoTestApp.models import Student,Score,Books#導入Books模型 class BooksAdmin(admin.ModelAdmin):#增加后台操作 list_display = ('No','Name','CreateTime','UpdateTime',) date_hierarchy = 'CreateTime' search_fields = ('Name',) admin.site.register(Books,BooksAdmin)#注冊表
此時刷新界面進入Bookss可以看到這邊多了個如下框中的插件:
完結!