主要功能
功能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.獲職保存函數