python之Django學習筆記(五)---后台(admin.py)基礎參數介紹


在前面文章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可以看到這邊多了個如下框中的插件:

 

 

官方文檔

完結!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM