Django Admin后台管理功能使用+二次開發


主要功能

功能1:提供數據庫管理功能

   基於admin模塊,可以實現類似數據庫客戶端的功能,對數據進行增刪改查

功能2:二次開發

   基於該模塊的數據管理功能,可以二次定制一些實用的功能。

基本使用方法

使用 AbstractUser 重寫用戶表,變量用的中文,本人英文不好,我是一個小白,用中文便於自已理解,很多是自已的是理解,有不對的請指正,謝謝!

步驟1:在  app 的 models.py 文件中創建表

復制代碼
  1 """ A001jcxx===>基礎信息模塊"""
  2 # 導包規范-1.Python標准模塊
  3 from django.db import models
  4 from django.contrib.auth.models import AbstractUser  # AbstractUser繼承原用django中的用戶原有字段再擴展
  5 # 導包規范-2.第三方模塊
  6 from multiselectfield import MultiSelectField
  7 # 導包規范-3.自定義模塊
  8 
  9 
 10 # 000-共公model用的字段表,模型抽象基類
 11 class BaseModel(models.Model):
 12     創建時間 = models.DateTimeField(auto_now_add=True)
 13     更新時間 = models.DateTimeField(auto_now=True)
 14     刪除標記 = models.BooleanField(default=False)
 15 
 16     class Meta:  # 說明是一個抽象模型類,class Meta做為嵌套類,主要目的是給上級類添加一些功能,或者指定一些標准
 17         abstract = True  # 定義這類是不是抽象類,所謂抽象類就是在實例的時候並不會起作用,只是用來定義一些公共字段,給子類提供繼承,子類是可以創建表的。
 18 
 19 
 20 # 01-用戶個人信息
 21 class UserProfile(AbstractUser, BaseModel):
 22     # 必需在settings中設定,配置django認證系統使用的模型類AbstractUse,必需配置 AUTH_USER_MODEL= "APP名.模型類名"
 23     """
 24     設計字段屬性:字段大小,是否必填,是否唯一。
 25     字段常用參數說明:
 26         null=True:文本類型字段(CharField,TextField)不要設置此參數,文本類數據庫中默認存的是一個空字符串,並不是一個null值.
 27         blank=True:表單驗證層的,不影響數據庫.
 28         default:默認值,可以指定一個函數,保存前先執行函數,再將函數值保存到數據庫中.(例:default=now).
 29             default='' 相當於 blank=True, null=True,兩者具有相同的結果
 30         db_column:改變映射到數據庫存中模型字段名.
 31         primary_key=True:主鍵.
 32         unique:字段值設為唯一,一般郵箱/手機號碼.
 33 
 34     Meta設置
 35         db_table:模型映射到數據庫中的名字.
 36         ordering:排序,使用一個列表,可以設定多個參數,按給定字段順序排序,倒序在排序字段前加負號'-'.
 37 
 38     外鍵和表的關系 見博客 https://www.cnblogs.com/djtang/articles/13388301.html
 39 外鍵所放位置
 40     一對一:外鍵放在不常用的一方
 41     一對多:外鍵放在多的一方
 42     多對多:外鍵放在常用的一方
 43     外鍵字段為正向查詢字段,related_name='學生班級'是反向查詢字段別名
 44 外鍵如何斷關聯
 45     設置外鍵字段db_constraint=False
 46 外鍵間的級聯關系
 47     一對一:學生沒有了,學生證也沒有了=============> on_delete=models.CASCADE,
 48     一對多:班級沒有了,學生還是哪個班級的學生=======> on_delete=models.DO_NOTHING
 49     一對多:班級沒有了,學生沒有班級,班級為空========> on_delete=models.SET_NULL, null=True, blank=True
 50     一對多:班級沒有了,學生進入默認的班級(默認值)====> on_delete=models.SET_DEFAULT, default="默認值"
 51     多對多:不能設置 on_delete,實際關系中,ORM默認關系表中兩個外鍵都是級聯
 52 choices設計注意字段的屬性,兩都要一致,SmallIntegerField,后面寫入數據的字段屬性就是數據字型的1.2,CharField后面就要寫成字符串'1','2'
 53     性別 = models.SmallIntegerField(max_length=2, blank=True, choices=((1, '男'), (2, '女')))
 54     性別 = models.CharField(max_length=2, blank=True, choices=(('1', '男'), ('2', '女')))
 55 多選框的使用
 56     1.pip install django-multiselectfield
 57     2.from multiselectfield import MultiSelectField
 58     3.愛好 = MultiSelectField(u"愛好1", choices=(('打球1', u'籃球'), ('足球1', u'足球'), ('french', '法語')))
 59     4."愛好1"是在admin顯志的列標題,'打球1'是在admin顯示頁面的顯示的內容,"u'籃球'"是在增加和編輯的顯示的內容,一定要加u,不然編輯會報錯!
 60 django modeladmin重新排序
 61     方法1:admin左則菜單app下數據庫表是按verbose_name排序的
 62     方法2:
 63     1.pip install django-modeladmin-reorder
 64     2.INSTALLED_APPS中配 'admin_reorder',
 65     3.將modeladminireorder添加到中間件類,MIDDLEWARE_CLASSES 中 'admin_reorder.middleware.ModelAdminReorder',
 66     4.
 67 
 68     """
 69     # AbstractUser中已有字段:
 70     # id(主鍵字段)
 71     # password(密碼)
 72     # last_login(最后登錄時間)
 73     # is_superuser(是否超級用戶)
 74     # username(用戶名,不要改動)
 75     # first_name(第一次用戶名)
 76     # last_name(最后一次用戶名)
 77     # email(郵箱)
 78     # is_staff(是否職員)
 79     # is_active(是否激活)
 80     # date_joined(加入時間)
 81     二維碼 = models.CharField(max_length=64, blank=True, null=True, )  # 不重復v
 82     個人編號 = models.CharField(max_length=16, unique=True)  # 必填,唯一.
 83     真實姓名 = models.CharField(max_length=16)  # 必填,可重復
 84     性別 = models.SmallIntegerField(blank=True, null=True, choices=((1, '男'), (2, '女')))  # 可填
 85     手機號碼 = models.CharField(max_length=11, unique=True, blank=True, null=True)  # 必填,唯一,在第一次增加管理員時要用blank=True
 86     # 一個(用戶個人)對應一個(公司),一個(公司)有多個(用戶個人),刪除(用戶個人)時(公司企業信息表)中(用戶個人)為空,(公司企業信息表)中的(公司)還在
 87     # related_name='人員_公司'就是通過此表UserProfile查公司企業信息表Company,直接就是:全部公司信息 = Company.人員_公司.all()
 88     公司名稱 = models.ForeignKey('Company', on_delete=models.SET_NULL, null=True, blank=True, related_name='人員公司')
 89     部門名稱 = models.ForeignKey('Department', on_delete=models.SET_NULL, null=True, blank=True, related_name='人員部門')
 90 
 91     class Meta:
 92         verbose_name = '01-用戶個人信息'
 93         verbose_name_plural = verbose_name
 94 
 95     def __str__(self):  # 必需有值的字段,當前對象的描寫
 96         return self.username  # 返回此對象的用戶名username
 97 
 98 
 99 # 02-公司部門信息
100 class Department(BaseModel):
101     部門編碼 = models.CharField(max_length=16, unique=True)  # 必填,唯一.
102     部門名稱 = models.CharField(max_length=24, unique=True)  # 必填,唯一.
103     # 基於平台設計的一對多關系,對應公司進入對應的部門,不能A公司進入B公司的部門
104     # 一個(公司部門)對應一個(公司),一個(公司)有多個(公司部門),刪除(公司部門)時(公司企業信息表)中(公司部門)為空,(公司企業信息表)中的(公司)還在
105     公司名稱 = models.ForeignKey('Company', on_delete=models.SET_NULL, null=True, blank=True, related_name='部門公司')
106 
107     class Meta:
108         verbose_name = '02-公司部門信息'
109         verbose_name_plural = verbose_name
110 
111     def __str__(self):
112         return self.部門名稱
113 
114 
115 # 03-客商公司信息(自已/供應商/客戶)
116 class Company(BaseModel):
117     公司編號 = models.CharField(max_length=16, unique=True)  # 必填,唯一.
118     公司全稱 = models.CharField(max_length=64, unique=True)  # 必填,唯一.
119     公司簡稱 = models.CharField(max_length=32, unique=True)  # 必填,唯一.
120     # 使用ImageField類型,需要按裝圖像處理標准庫Pillow,default=''相當於blank=True, null=True
121     公司logo = models.ImageField(max_length=128, upload_to='A001jcxx/company/image/%y/%m', null=True, blank=True)  # 可填
122     公司地址 = models.CharField(max_length=128, blank=True, null=True)  # 可填
123 
124     class Meta:
125         verbose_name = '03-01-客商公司信息'
126         verbose_name_plural = verbose_name
127 
128     def __str__(self):
129         return self.公司全稱
復制代碼

 

步驟2:必需在settings中設定,配置django認證系統使用的模型類AbstractUse,必需配置 AUTH_USER_MODEL= "APP名.UserProfile",這里的APP名是你自已取的,后面UserProfile就是上面的表名

步驟3:在對應 app 的  admin.py  中注冊上在三個表

復制代碼
 1 # 002-用戶信息表
 2 @admin.register(UserProfile)
 3 class UserProfileAdmin(UserAdmin):  # 相當於注冊到UserAdmin中了.重載他的驗證方法和顯示字段配置,配置要按UserAdmin的方法配置.
 4     pass
 5 
 6 
 7 # 003-部門信息表
 8 @admin.register(Department)
 9 class DepartmentAdmin(admin.ModelAdmin):
10     pass
11 
12 
13 # 004 - 企業信息表(自已/供應商/客戶)
14 @admin.register(Company)
15 class CompanyAdmin(admin.ModelAdmin):
16     pass
復制代碼

步驟4:生成表結構

  python manage.py makemigrations

  python manage.py migrate

  注意:對數據庫中已有數據作表結構變動時,可能會提示一些必填字段信息的提示,不能直接重新同步數據庫,此時的解決方法有兩種,一種是,設置新增字段的default='xxx'某個值, 但是這種通用性不是很好。 另外一種是,設置該字段null=True,即允許為空即可,我一般都刪庫重來.

步驟5:運行項目,登陸管理界面

python manage.py runserver
 
訪問URL:http://IP:8000/admin

四  顯示設置(在對應 app 的  admin.py  中配置)

1.用戶表 UserProfileAdmin 中增加頁面和修改頁面相關字段的配置,主要是新增字段,同時密碼是密文的,解決是明文的問題.可根據自已的需求自行再調整

復制代碼
 1 # 002-用戶信息表
 2 @admin.register(UserProfile)
 3 class UserProfileAdmin(UserAdmin):
 4     # 1.增加用戶信息頁面字段設置,對字段分組分塊設計的.
 5     add_fieldsets = (
 6         # 用戶信息塊,None是這個塊塊頭,表示沒有塊頭
 7         (None, {u'fields': ('username', 'password1', 'password2')}),
 8         # 增加用戶信息頁面字段設置,字段顯示按排列順序顯示的,這里的塊頭就是'用戶詳情'
 9         (('用戶詳情'), {'fields': ('人員編號', '性別', '手機號碼', '企業名稱', '部門名稱', 'is_staff', 'is_superuser')}),)
10     # 2.修改頁面字段設置,對字段分組分塊設計的.
11     fieldsets = (
12         # 個人信息塊
13         (('用戶信息'), {'fields': ('人員編號', '性別', 'username', 'password', 'email', '手機號碼', '企業名稱', '部門名稱')}),
14         # 權限信息塊
15         (('用戶權限'), {
16             'fields': ('is_active', 'is_staff', 'is_superuser', 'groups', 'user_permissions')}),
17     )
復制代碼

 修改后的增加用戶信息頁面,這時注冊后用戶密碼就是密文的了,在修改用戶信息頁面就看不到密碼了,要用增加的用戶登錄admin必需在注冊時把 職員狀態 勾上,不然登錄不了后台.

  

2.顯示用戶頁面字段的設置  

復制代碼
 1 # 002-用戶信息表
 2 @admin.register(UserProfile)
 3 class UserProfileAdmin(UserAdmin):
 4     # 1.增加用戶信息頁面字段設置,對字段分組分塊設計的.
 5     add_fieldsets = (
 6         # 用戶信息塊,None是這個塊塊頭,表示沒有塊頭
 7         (None, {u'fields': ('username', 'password1', 'password2')}),
 8         # 增加用戶信息頁面字段設置,字段顯示按排列順序顯示的,這里的塊頭就是'用戶詳情'
 9         (('用戶詳情'), {'fields': ('人員編號', '性別', '手機號碼', '企業名稱', '部門名稱', 'is_staff', 'is_superuser')}),)
10     # 2.修改頁面字段設置,對字段分組分塊設計的.
11     fieldsets = (
12         # 個人信息塊
13         (('用戶信息'), {'fields': ('人員編號', '性別', 'username', 'password', 'email', '手機號碼', '企業名稱', '部門名稱')}),
14         # 權限信息塊
15         (('用戶權限'), {
16             'fields': ('is_active', 'is_staff', 'is_superuser', 'groups', 'user_permissions')}),
17     )
18     # 3.顯示用戶頁面字段的設置
19     list_display = (  # 展示頁面顯示字段設置,字段順序應是排列順度,第一個字段名默認可以點去明細編輯.
20         'is_staff', '人員編號', '性別', 'username', '手機號碼', 'email', '部門名稱', '企業名稱', 'is_superuser', 'last_login',
21         '創建時間','更新時間', '刪除標記')
復制代碼

顯示頁面配置后如下圖:

 3.改變超級用戶狀態和刪除標記下顯示的方法,如上圖

復制代碼
 1 # 002-用戶信息表
 2 @admin.register(UserProfile)
 3 class UserProfileAdmin(UserAdmin):
 4     # 1.增加用戶信息頁面字段設置,對字段分組分塊設計的.
 5     add_fieldsets = (
 6         # 用戶信息塊,None是這個塊塊頭,表示沒有塊頭
 7         (None, {u'fields': ('username', 'password1', 'password2')}),
 8         # 增加用戶信息頁面字段設置,字段顯示按排列順序顯示的,這里的塊頭就是'用戶詳情'
 9         (('用戶詳情'), {'fields': ('人員編號', '性別', '手機號碼', '企業名稱', '部門名稱', 'is_staff', 'is_superuser')}),)
10     # 2.修改頁面字段設置,對字段分組分塊設計的.
11     fieldsets = (
12         # 個人信息塊
13         (('用戶信息'), {'fields': ('人員編號', '性別', 'username', 'password', 'email', '手機號碼', '企業名稱', '部門名稱')}),
14         # 權限信息塊
15         (('用戶權限'), {
16             'fields': ('is_active', 'is_staff', 'is_superuser', 'groups', 'user_permissions')}),
17     )
18 
19     # 4.改變刪除標記下顯示的方法,在list_display中不要加引號,list_display必需放到函數方法后面
20     def 刪除標記(self):  # 這個方法名"刪除標記"在 list_display 里配置時不要加引號
21         if self.刪除標記:
22             return '是'
23         else:
24             return '否'
25 
26     def 登錄權限(self):  # 這個方法名"登錄權限"在 list_display 里配置時不要加引號
27         if self.is_staff:
28             return '是'
29         else:
30             return '否'
31 
32     def is_superuser(self):  # 這個方法名"is_superuser"在 list_display 里配置時不要加引號
33         if self.is_superuser:
34             return '是'
35         else:
36             return '否'
37     is_superuser.short_description = '是否超級用戶'  # 將 is_superuser 在展示頁面顯示為中方 '是否超級用戶',
38     # 3.展示頁面顯示字段設置,字段順序應是排列順度,第一個字段名默認可以點去明細編輯.
39     list_display = (
40         '人員編號', '性別', 'username', '手機號碼', 'email', '部門名稱', '企業名稱',  'last_login', '創建時間',
41         '更新時間', 登錄權限, is_superuser, 刪除標記)
復制代碼

配置后顯示如下:

 

 

 

五  其它配置網上講的太多就抄一下吧備查

# 在列表頁顯示的字段,默認會顯示所有字段,有對應的方法可以重寫
list_display  =  ( '__str__' ,)
# 在列表頁顯示的字段中,可以鏈接到change_form頁面的字段
list_display_links  =  ()
# 右側的篩選,必須是字段,可以繼承自SimpleListFilter來自定義篩選字段和規則,SimpleListFilter的方法在后面詳細介紹
list_filter  =  ()
# 聯表查詢是否自動查詢,可以是布爾,列表或元組,如果是列表或元組,則級聯查詢指定的字段
list_select_related  =  False
# 列表頁每頁展示的條數
list_per_page  =  100
# 分頁,顯示全部,真是數據小於該值時才會顯示全部
list_max_show_all  =  200
# 在列表頁可以編輯的字段
list_editable  =  ()
# 在列表頁可以模糊搜索的字段
search_fields  =  ()
# 對Date和DateTime類型進行搜索
date_hierarchy  =  None
# 在change_form頁面,按鈕為,save按鈕的值(save as new和save add another)
save_as  =  False
# 點擊保存並繼續編輯
save_as_continue  =  True
# save按鈕的位置,是True則顯示在頁面上方
save_on_top  =  False
# 自定義分頁類
paginator  =  Paginator
# 詳細頁面,刪除、修改,更新后跳轉回列表后,是否保留原搜索條件管理員現在在創建,編輯或刪除對象后保留列表視圖中的過濾器。
# 可以將此屬性設置為False,以恢復之前清除過濾器的行為。
preserve_filters  =  True
# 在詳情頁面,如果有FK到其他表,在詳情頁中可以動態的填加或刪除級聯數據
inlines  =  []
admin中action操作的設置
admin中的action是指在列表頁的動作,默認為刪除所選的條目,可以自定義填加動作,將動作注冊到action中,需要是一個方法
# 定制action中的操作
actions  =  []
action_form  =  helpers.ActionForm
# action選項顯示的位置,頁面上方或者頁面下方
actions_on_top  =  True
actions_on_bottom  =  False
# 是否顯示action選擇的個數
actions_selection_counter  =  True
checks_class  =  ModelAdminChecks
BaseModelAdmin中的屬性
除了ModelAdmin中的屬性,也可以自定義在其父類BaseModelAdmin中的屬性和方法,是一些通用的,在繼承子BaseModelAdmin的類中也可以完成的屬性設置.一般是詳情頁的屬性.
# 自動補全,外鍵查詢數據多時,方便查找
autocomplete_fields  =  ()
# 詳情頁,針對外鍵和M2M字段變成input框形式
raw_id_fields  =  ()
# 詳情頁面展示的字段
fields  =  None
# 詳情頁面排除的字段,字段可以是數據庫中的也可以是自定義的
exclude  =  None
# 在詳情頁面對數據進行分隔顯示,對應到admin模板中的'fieldsets.html'
fieldsets  =  None
# 為詳情頁指定form表單,可以自定義顯示的數據,字段
form  =  forms.ModelForm
# 下面兩個是M2M顯示時,數據移動選擇.可以參考admin中用戶的權限操作
filter_vertical  =  ()  # 縱向展示
filter_horizontal  =  ()  # 橫向展示
# 詳情頁面使用radio顯示選項,FK默認使用select
radio_fields  =  {}
# 填加頁面,在某字段輸入值后,自動填加到指定字段
# prepopulated_fields = {"email": ("user",)},email字段會在用戶填加user字段時自動填充
prepopulated_fields  =  {}
# 詳情頁指定顯示的插件,后面詳細說明
formfield_overrides  =  {}
# 詳情頁面的只讀字段
readonly_fields  =  ()
# 詳情頁面排序規則
ordering  =  None
# 禁止某些排序,為空則禁止所有的排序
sortable_by  =  None
# 編輯時是否在頁面上顯示view on set,可以通過方法來返回一個鏈接,后面說明
view_on_site  =  True
# 列表頁,模糊搜索后面顯示的數據個數樣式
# 為True是顯示條數,為False時顯示全部
show_full_result_count  =  True
checks_class  =  BaseModelAdminChecks

 

六  功能的二次開發

1.自定義字段

方法1:在 models.py 中定議

 

方法2:在 admin.py 中定議

 自定義字段名: times.short description = '字段別名'

 

2.自定義 html 語言

2.1 導入方法

 

2.2 使用方法

 

3.imageField 顯示方法

3.1 導入方法

 

 3.2 使用方法

 

3.獲取數據函數

 

 4.獲職保存函數

 

 


免責聲明!

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



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