DJANGO ADMIN 的一些實用配置


 

DJANGO ADMIN 一些有用的設置

 
Django自帶的后台管理是Django明顯特色之一,可以讓我們快速便捷管理數據。后台管理可以在各個app的admin.py文件中進行控制。以下是我最近摸索總結出比較實用的配置。若你有什么比較好的配置,歡迎補充。

 

一、基本設置

1、應用注冊

若要把app應用顯示在后台管理中,需要在admin.py中注冊。這個注冊有兩種方式,我比較喜歡用裝飾器的方式。

先看看普通注冊方法。打開admin.py文件,如下代碼:

1
2
3
4
5
6
7
8
9
from  django.contrib  import  admin
from  blog.models  import  Blog
  
#Blog模型的管理器
class  BlogAdmin(admin.ModelAdmin):
     list_display = ( 'id' 'caption' 'author' 'publish_time' )
     
#在admin中注冊綁定
admin.site.register(Blog, BlogAdmin)

  上面方法是將管理器和注冊語句分開。有時容易忘記寫注冊語句,或者模型很多,不容易對應。

還有一種方式是用裝飾器,該方法是Django1.7的版本新增的功能:

1
2
3
4
5
6
7
from  django.contrib  import  admin
from  blog.models  import  Blog
  
#Blog模型的管理器
@admin .register(Blog)
class  BlogAdmin(admin.ModelAdmin):
     list_display = ( 'id' 'caption' 'author' 'publish_time' )

  該方式比較方便明顯,推薦用這種方式。

 

2、admin界面漢化

默認admin后台管理界面是英文的,對英語盲來說用起來不方便。可以在settings.py中設置:

  1. LANGUAGE_CODE = 'zh-CN'
  2. TIME_ZONE = 'Asia/Shanghai'

1.8版本之后的language code設置不同:

  1. LANGUAGE_CODE = 'zh-hans'
  2. TIME_ZONE = 'Asia/Shanghai'

 

二、記錄列表界面設置

記錄列表是我們打開后台管理進入到某個應用看到的界面,如下所示:

 

我們可以對該界面進行設置,主要包括列表和篩選器。

 

1、記錄列表基本設置

比較實用的記錄列表設置有顯示字段、每頁記錄數和排序等。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
from  django.contrib  import  admin
from  blog.models  import  Blog
  
#Blog模型的管理器
@admin .register(Blog)
class  BlogAdmin(admin.ModelAdmin):
     #listdisplay設置要顯示在列表中的字段(id字段是Django模型的默認主鍵)
     list_display  =  ( 'id' 'caption' 'author' 'publish_time' )
    
     #list_per_page設置每頁顯示多少條記錄,默認是100條
     list_per_page  =  50
    
     #ordering設置默認排序字段,負號表示降序排序
     ordering  =  ( '-publish_time' ,)
  
     #list_editable 設置默認可編輯字段
     list_editable  =  [ 'machine_room_id' 'temperature' ]
  
     #fk_fields 設置顯示外鍵字段
      fk_fields  =  ( 'machine_room_id' ,)

  

此處比較簡單,自己嘗試一下即可。

 

另外,默認可以點擊每條記錄第一個字段的值可以進入編輯界面。 

 

我們可以設置其他字段也可以點擊鏈接進入編輯界面。

1
2
3
4
5
6
7
8
from  django.contrib  import  admin
from  blog.models  import  Blog
  
#Blog模型的管理器
@admin .register(Blog)
class  BlogAdmin(admin.ModelAdmin):   
     #設置哪些字段可以點擊進入編輯界面
     list_display_links  =  ( 'id' 'caption' )

  

2、篩選器

篩選器是Django后台管理重要的功能之一,而且Django為我們提供了一些實用的篩選器。

主要常用篩選器有下面3個:

1
2
3
4
5
6
7
8
9
10
11
12
from  django.contrib  import  admin
from  blog.models  import  Blog
  
#Blog模型的管理器
@admin .register(Blog)
class  BlogAdmin(admin.ModelAdmin):
     list_display  =  ( 'id' 'caption' 'author' 'publish_time' )
     
     #篩選器
     list_filter  = ( 'trouble' 'go_time' 'act_man__user_name' 'machine_room_id__machine_room_name' #過濾器
     search_fields  = ( 'server' 'net' 'mark' #搜索字段
     date_hierarchy  =  'go_time'     # 詳細時間分層篩選 

對應效果如下:

 此處注意:

使用  date_hierarchy  進行詳細時間篩選的時候 可能出現報錯:Database returned an invalid datetime value. Are time zone definitions for your database and pytz installed?

處理方法:  

命令行直接執行此命令:     [root@mysql ~]#    mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root mysql
然后重啟數據庫即可。
 

一般ManyToManyField多對多字段用過濾器;標題等文本字段用搜索框;日期時間用分層篩選。

過濾器如果是外鍵需要遵循這樣的語法:本表字段__外鍵表要顯示的字段。如:“user__user_name”

 
3、顏色顯示
想對某些字段設置顏色,可用下面的設置:
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
from  django.db  import  models
from  django.contrib  import  admin
from  django.utils.html  import  format_html
 
class  Person(models.Model):
     first_name  =  models.CharField(max_length = 50 )
     last_name  =  models.CharField(max_length = 50 )
     color_code  =  models.CharField(max_length = 6 )
 
     def  colored_name( self ):
         return  format_html(
             '<span style="color: #{};">{} {}</span>' ,
             self .color_code,
             self .first_name,
             self .last_name,
         )
 
class  PersonAdmin(admin.ModelAdmin):
     list_display  =  ( 'first_name' 'last_name' 'colored_name' )

  

實際代碼( 注意看上面代碼,是寫在models里,而不是admin中的ModelAdmin里):

 

效果:

 

但是,我們看到標題並不是我們想要的,那么如何設置標題呢?
 
添加一行代碼:colored_status.short_description = u"狀態"

 

在函數結束之后添加上面代碼即可

 

 4.調整頁面頭部顯示內容和頁面標題

代碼:

1
2
3
4
5
class  MyAdminSite(admin.AdminSite):
     site_header  =  '好醫生運維資源管理系統'   # 此處設置頁面顯示標題
     site_title  =  '好醫生運維'   # 此處設置頁面頭部標題
 
admin_site  =  MyAdminSite(name = 'management' )

  需要注意的是:  admin_site = MyAdminSite(name='management') 此處括號內name值必須設置,否則將無法使用admin設置權限

注冊的時候使用admin_site.register,而不是默認的admin.site.register。

效果如下:

 

 
5.通過當前登錄的用戶過濾顯示的數據
官方文檔的介紹:

 

 
實際代碼和效果:
 
@admin.register(MachineInfo)
class MachineInfoAdmin(admin.ModelAdmin):
 
    def get_queryset(self, request):
        """函數作用:使當前登錄的用戶只能看到自己負責的服務器"""
        qs = super(MachineInfoAdmin, self).get_queryset(request)
        if request.user.is_superuser:
            return qs
        return qs.filter(user=UserInfo.objects.filter(user_name=request.user))
 
    list_display = ('machine_ip', 'application', 'colored_status', 'user', 'machine_model', 'cache',
                    'cpu', 'hard_disk', 'machine_os', 'idc', 'machine_group')

 

 

 

三、編輯界面設置

編輯界面是我們編輯數據所看到的頁面。我們可以對這些字段進行排列設置等。

若不任何設置,如下圖所示:

 

這個界面比較簡陋,需要稍加設置即可。

 

1、編輯界面設置

首先多ManyToMany多對多字段設置。可以用filter_horizontal或filter_vertical:

 
            
  1. #Many to many 字段
  2. filter_horizontal=('tags',)

效果如下圖:

 

這樣對多對多字段操作更方便。

另外,可以用fields或exclude控制顯示或者排除的字段,二選一即可。

例如,我想只顯示標題、作者、分類標簽、內容。不想顯示是否推薦字段,可以如下兩種設置方式:

 
            
  1. fields =  ('caption', 'author', 'tags', 'content')

或者

 
            
  1. exclude = ('recommend',) #排除該字段

設置之后,你會發現這些字段都是一個字段占一行。若想兩個字段放在同一行可以如下設置:

 
            
  1. fields =  (('caption', 'author'), 'tags', 'content')

效果如下:

 

 

2、編輯字段集合

不過,我不怎么用fields和exclude。用得比較多的是fieldsets。該設置可以對字段分塊,看起來比較整潔。如下設置:

 
            
  1. fieldsets = (
  2.     ("base info", {'fields': ['caption', 'author', 'tags']}),
  3.     ("Content", {'fields':['content', 'recommend']})
  4. )

效果如下:

 

 

3、一對多關聯

還有一種比較特殊的情況,父子表的情況。編輯父表之后,再打開子表編輯,而且子表只能一條一條編輯,比較麻煩。

這種情況,我們也是可以處理的,將其放在同一個編輯界面中。

例如,有兩個模型,一個是訂單主表(BillMain),記錄主要信息;一個是訂單明細(BillSub),記錄購買商品的品種和數量等。

admin.py如下:

 
            
  1. #coding:utf-8
  2. from django.contrib import admin
  3. from bill.models import BillMain, BillSub
  4.  
  5. @admin.register(BillMain)
  6. class BillMainAdmin(admin.ModelAdmin):
  7.     inlines = [BillSubInline,]    #Inline把BillSubInline關聯進來
  8.     list_display = ('bill_num', 'customer',)
  9.     
  10. class BillSubInline(admin.TabularInline):
  11.     model = BillSub
  12.     extra = 5 #默認顯示條目的數量

 

這樣就可以快速方便處理數據。

相關的admin比較有用的設置大致這些,若你覺得還有一些比較有用的,可以留意參與討論。

 

4.設置只讀字段

 在使用admin的時候,ModelAdmin默認對於model的操作只有增加,修改和刪除,但是總是有些字段是不希望用戶來編輯的。而 readonly_fields 設置之后不管是admin還是其他用戶都會變成只讀,而我們通常只是想限制普通用戶。 這時我們就可以通過重寫 get_readonly_fields 方法來實現對特定用戶的只讀顯示。

官網介紹:  (https://docs.djangoproject.com/en/1.10/ref/contrib/admin/#django.contrib.admin.ModelAdmin.readonly_fields

代碼:

1
2
3
4
5
6
7
8
9
10
class  MachineInfoAdmin(admin.ModelAdmin):
 
     def  get_readonly_fields( self , request, obj = None ):
         """  重新定義此函數,限制普通用戶所能修改的字段  """
         if  request.user.is_superuser:
             self .readonly_fields  =  []
         return  self .readonly_fields
     
     readonly_fields  =  ( 'machine_ip' 'status' 'user' 'machine_model' 'cache' ,
                        'cpu' 'hard_disk' 'machine_os' 'idc' 'machine_group' )

  效果:

 

 

 

參考了博客:http://yshblog.com/blog/

 

參考網站: http://code.ziqiangxuetang.com/django/django-admin.html

                  http://django-intro-zh.readthedocs.io/zh_CN/latest/part2/

 

DJANGO ADMIN 一些有用的設置

 
Django自帶的后台管理是Django明顯特色之一,可以讓我們快速便捷管理數據。后台管理可以在各個app的admin.py文件中進行控制。以下是我最近摸索總結出比較實用的配置。若你有什么比較好的配置,歡迎補充。

 

一、基本設置

1、應用注冊

若要把app應用顯示在后台管理中,需要在admin.py中注冊。這個注冊有兩種方式,我比較喜歡用裝飾器的方式。

先看看普通注冊方法。打開admin.py文件,如下代碼:

1
2
3
4
5
6
7
8
9
from  django.contrib  import  admin
from  blog.models  import  Blog
  
#Blog模型的管理器
class  BlogAdmin(admin.ModelAdmin):
     list_display = ( 'id' 'caption' 'author' 'publish_time' )
     
#在admin中注冊綁定
admin.site.register(Blog, BlogAdmin)

  上面方法是將管理器和注冊語句分開。有時容易忘記寫注冊語句,或者模型很多,不容易對應。

還有一種方式是用裝飾器,該方法是Django1.7的版本新增的功能:

1
2
3
4
5
6
7
from  django.contrib  import  admin
from  blog.models  import  Blog
  
#Blog模型的管理器
@admin .register(Blog)
class  BlogAdmin(admin.ModelAdmin):
     list_display = ( 'id' 'caption' 'author' 'publish_time' )

  該方式比較方便明顯,推薦用這種方式。

 

2、admin界面漢化

默認admin后台管理界面是英文的,對英語盲來說用起來不方便。可以在settings.py中設置:

  1. LANGUAGE_CODE = 'zh-CN'
  2. TIME_ZONE = 'Asia/Shanghai'

1.8版本之后的language code設置不同:

  1. LANGUAGE_CODE = 'zh-hans'
  2. TIME_ZONE = 'Asia/Shanghai'

 

二、記錄列表界面設置

記錄列表是我們打開后台管理進入到某個應用看到的界面,如下所示:

 

我們可以對該界面進行設置,主要包括列表和篩選器。

 

1、記錄列表基本設置

比較實用的記錄列表設置有顯示字段、每頁記錄數和排序等。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
from  django.contrib  import  admin
from  blog.models  import  Blog
  
#Blog模型的管理器
@admin .register(Blog)
class  BlogAdmin(admin.ModelAdmin):
     #listdisplay設置要顯示在列表中的字段(id字段是Django模型的默認主鍵)
     list_display  =  ( 'id' 'caption' 'author' 'publish_time' )
    
     #list_per_page設置每頁顯示多少條記錄,默認是100條
     list_per_page  =  50
    
     #ordering設置默認排序字段,負號表示降序排序
     ordering  =  ( '-publish_time' ,)
  
     #list_editable 設置默認可編輯字段
     list_editable  =  [ 'machine_room_id' 'temperature' ]
  
     #fk_fields 設置顯示外鍵字段
      fk_fields  =  ( 'machine_room_id' ,)

  

此處比較簡單,自己嘗試一下即可。

 

另外,默認可以點擊每條記錄第一個字段的值可以進入編輯界面。 

 

我們可以設置其他字段也可以點擊鏈接進入編輯界面。

1
2
3
4
5
6
7
8
from  django.contrib  import  admin
from  blog.models  import  Blog
  
#Blog模型的管理器
@admin .register(Blog)
class  BlogAdmin(admin.ModelAdmin):   
     #設置哪些字段可以點擊進入編輯界面
     list_display_links  =  ( 'id' 'caption' )

  

2、篩選器

篩選器是Django后台管理重要的功能之一,而且Django為我們提供了一些實用的篩選器。

主要常用篩選器有下面3個:

1
2
3
4
5
6
7
8
9
10
11
12
from  django.contrib  import  admin
from  blog.models  import  Blog
  
#Blog模型的管理器
@admin .register(Blog)
class  BlogAdmin(admin.ModelAdmin):
     list_display  =  ( 'id' 'caption' 'author' 'publish_time' )
     
     #篩選器
     list_filter  = ( 'trouble' 'go_time' 'act_man__user_name' 'machine_room_id__machine_room_name' #過濾器
     search_fields  = ( 'server' 'net' 'mark' #搜索字段
     date_hierarchy  =  'go_time'     # 詳細時間分層篩選 

對應效果如下:

 此處注意:

使用  date_hierarchy  進行詳細時間篩選的時候 可能出現報錯:Database returned an invalid datetime value. Are time zone definitions for your database and pytz installed?

處理方法:  

命令行直接執行此命令:     [root@mysql ~]#    mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root mysql
然后重啟數據庫即可。
 

一般ManyToManyField多對多字段用過濾器;標題等文本字段用搜索框;日期時間用分層篩選。

過濾器如果是外鍵需要遵循這樣的語法:本表字段__外鍵表要顯示的字段。如:“user__user_name”

 
3、顏色顯示
想對某些字段設置顏色,可用下面的設置:
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
from  django.db  import  models
from  django.contrib  import  admin
from  django.utils.html  import  format_html
 
class  Person(models.Model):
     first_name  =  models.CharField(max_length = 50 )
     last_name  =  models.CharField(max_length = 50 )
     color_code  =  models.CharField(max_length = 6 )
 
     def  colored_name( self ):
         return  format_html(
             '<span style="color: #{};">{} {}</span>' ,
             self .color_code,
             self .first_name,
             self .last_name,
         )
 
class  PersonAdmin(admin.ModelAdmin):
     list_display  =  ( 'first_name' 'last_name' 'colored_name' )

  

實際代碼( 注意看上面代碼,是寫在models里,而不是admin中的ModelAdmin里):

 

效果:

 

但是,我們看到標題並不是我們想要的,那么如何設置標題呢?
 
添加一行代碼:colored_status.short_description = u"狀態"

 

在函數結束之后添加上面代碼即可

 

 4.調整頁面頭部顯示內容和頁面標題

代碼:

1
2
3
4
5
class  MyAdminSite(admin.AdminSite):
     site_header  =  '好醫生運維資源管理系統'   # 此處設置頁面顯示標題
     site_title  =  '好醫生運維'   # 此處設置頁面頭部標題
 
admin_site  =  MyAdminSite(name = 'management' )

  需要注意的是:  admin_site = MyAdminSite(name='management') 此處括號內name值必須設置,否則將無法使用admin設置權限

注冊的時候使用admin_site.register,而不是默認的admin.site.register。

效果如下:

 

 
5.通過當前登錄的用戶過濾顯示的數據
官方文檔的介紹:

 

 
實際代碼和效果:
 
@admin.register(MachineInfo)
class MachineInfoAdmin(admin.ModelAdmin):
 
    def get_queryset(self, request):
        """函數作用:使當前登錄的用戶只能看到自己負責的服務器"""
        qs = super(MachineInfoAdmin, self).get_queryset(request)
        if request.user.is_superuser:
            return qs
        return qs.filter(user=UserInfo.objects.filter(user_name=request.user))
 
    list_display = ('machine_ip', 'application', 'colored_status', 'user', 'machine_model', 'cache',
                    'cpu', 'hard_disk', 'machine_os', 'idc', 'machine_group')

 

 

 

三、編輯界面設置

編輯界面是我們編輯數據所看到的頁面。我們可以對這些字段進行排列設置等。

若不任何設置,如下圖所示:

 

這個界面比較簡陋,需要稍加設置即可。

 

1、編輯界面設置

首先多ManyToMany多對多字段設置。可以用filter_horizontal或filter_vertical:

 
            
  1. #Many to many 字段
  2. filter_horizontal=('tags',)

效果如下圖:

 

這樣對多對多字段操作更方便。

另外,可以用fields或exclude控制顯示或者排除的字段,二選一即可。

例如,我想只顯示標題、作者、分類標簽、內容。不想顯示是否推薦字段,可以如下兩種設置方式:

 
            
  1. fields =  ('caption', 'author', 'tags', 'content')

或者

 
            
  1. exclude = ('recommend',) #排除該字段

設置之后,你會發現這些字段都是一個字段占一行。若想兩個字段放在同一行可以如下設置:

 
            
  1. fields =  (('caption', 'author'), 'tags', 'content')

效果如下:

 

 

2、編輯字段集合

不過,我不怎么用fields和exclude。用得比較多的是fieldsets。該設置可以對字段分塊,看起來比較整潔。如下設置:

 
            
  1. fieldsets = (
  2.     ("base info", {'fields': ['caption', 'author', 'tags']}),
  3.     ("Content", {'fields':['content', 'recommend']})
  4. )

效果如下:

 

 

3、一對多關聯

還有一種比較特殊的情況,父子表的情況。編輯父表之后,再打開子表編輯,而且子表只能一條一條編輯,比較麻煩。

這種情況,我們也是可以處理的,將其放在同一個編輯界面中。

例如,有兩個模型,一個是訂單主表(BillMain),記錄主要信息;一個是訂單明細(BillSub),記錄購買商品的品種和數量等。

admin.py如下:

 
            
  1. #coding:utf-8
  2. from django.contrib import admin
  3. from bill.models import BillMain, BillSub
  4.  
  5. @admin.register(BillMain)
  6. class BillMainAdmin(admin.ModelAdmin):
  7.     inlines = [BillSubInline,]    #Inline把BillSubInline關聯進來
  8.     list_display = ('bill_num', 'customer',)
  9.     
  10. class BillSubInline(admin.TabularInline):
  11.     model = BillSub
  12.     extra = 5 #默認顯示條目的數量

 

這樣就可以快速方便處理數據。

相關的admin比較有用的設置大致這些,若你覺得還有一些比較有用的,可以留意參與討論。

 

4.設置只讀字段

 在使用admin的時候,ModelAdmin默認對於model的操作只有增加,修改和刪除,但是總是有些字段是不希望用戶來編輯的。而 readonly_fields 設置之后不管是admin還是其他用戶都會變成只讀,而我們通常只是想限制普通用戶。 這時我們就可以通過重寫 get_readonly_fields 方法來實現對特定用戶的只讀顯示。

官網介紹:  (https://docs.djangoproject.com/en/1.10/ref/contrib/admin/#django.contrib.admin.ModelAdmin.readonly_fields

代碼:

1
2
3
4
5
6
7
8
9
10
class  MachineInfoAdmin(admin.ModelAdmin):
 
     def  get_readonly_fields( self , request, obj = None ):
         """  重新定義此函數,限制普通用戶所能修改的字段  """
         if  request.user.is_superuser:
             self .readonly_fields  =  []
         return  self .readonly_fields
     
     readonly_fields  =  ( 'machine_ip' 'status' 'user' 'machine_model' 'cache' ,
                        'cpu' 'hard_disk' 'machine_os' 'idc' 'machine_group' )

  效果:

 

 

 

參考了博客:http://yshblog.com/blog/

 

參考網站: http://code.ziqiangxuetang.com/django/django-admin.html

                  http://django-intro-zh.readthedocs.io/zh_CN/latest/part2/


免責聲明!

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



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