Django-CRM項目學習(一)-admin組件
開始今日份整理
1.admin組件使用
1.1 創建django項目以及開啟APP01
略
1.2 創建類
使用django自帶的sqlite3的小型文件型的數據庫
註:使用sqlite3類型的數據庫需要下載驅動
在app01.models創建類
from django.db import models # Create your models here. class Book(models.Model): title = models.CharField(max_length=32) price = models.DecimalField(max_digits=5, decimal_places=2) pub_date= models.DateField() publish = models.ForeignKey(‘Publish‘, on_delete=models.CASCADE, null=True) # modeles.CASCADE設置串行,由於和出版社關聯,在刪除出版社的只會刪除外鍵,不會刪除對象,只有在null # 為True才可以刪除。 staes = models.IntegerField(choices=[(1,‘已出版‘),(2,‘未出版‘)],default=1) author = models.ManyToManyField(‘Author‘) # 一對多關系 def __str__(self): return self.title class Publish(models.Model): # 出版社類 name = models.CharField(max_length=32) city = models.CharField(max_length=32) email = models.EmailField() def __str__(self): return self.name class Author(models.Model):# 作者類 name = models.CharField(max_length=32) age = models.IntegerField() au_detail = models.OneToOneField(‘Author_detail‘,on_delete=models.CASCADE,null=True) def __str__(self): return self.name class Author_detail(models.Model): # 作者詳情類 tel = models.CharField(max_length=32) address = models.CharField(max_length=64)
使用manage.py文件創建數據表並寫入到數據庫中,同時創建超級用戶
makemigrations:將庫寫入到內存中
migrate:將內存中的數據寫入到數據庫中
createsuperuser:創建超級用戶,用於登陸admin頁面
1.3 admin.py文件編輯
從app01.models中引入項目各個類
在下面輸入要創建的頁面
admin.site.register(Book,BookConfig)
admin.site.register(Publish,PublishConfig)
admin.site.register(Author,AuthorConfig)
admin.site.register(Author_detail)
啟動項目,在網頁中打開,展示如下
輸入用戶名密碼,進入到展示頁面
1.4 添加數據並展示數據
在頁面上分別添加出版社,作者以及書籍
自定義展示列表
#創建一個自定義類 class BookConfig(admin.ModelAdmin): #用於展示多對多關系,展示書籍作者 def show_authors(self,obj): print("obj",obj) return ‘|‘.join([obj.name for obj in obj.author.all()]) # 用於展示 list_display = [‘title‘,‘price‘,‘pub_date‘,‘publish‘,‘show_authors‘,‘staes‘] #在book相關admin中添加自定義類,BookConfig為新增 admin.site.register(Book,BookConfig)
上面的list_display為內置用法,用於顯示,最後展示如下
1.5 批量操作
批量操作為action操作
在上面的BookConfig中寫入
#action操作 # 價格初始化 def patch_init(self,request,queryset): print(‘queryset‘,queryset) queryset.update(price=0) patch_init.short_description = ‘價格初始化‘#設置多選服務 # 出版狀態初始化 def states_status(self,request,queryset): queryset.update(staes=2) states_status.short_description =‘出版狀態初始化‘ # 多選服務 actions = [patch_init,states_status] #其中.short_description以及actions為內置應用
展示如下
1.6 多重過濾
在上面的BookConfig類中寫入
#多重過濾 list_filter = [‘publish‘,‘author‘] #對出版社以及作者做過濾
展示如下
1.7 排序
在上面的BookConfig類中寫入
# 排序 ordering = [‘price‘,‘-id‘] #可以用倆個參數進行排序,默認是升序,加-號變為逆反
1.8 模糊查詢
# 模糊查詢 search_fields = [‘title‘,‘price‘] #如果title以及價格中都有特定的參數那麽都顯示
展示如下
admin整體代碼
from django.contrib import admin # Register your models here. from app01.models import Book,Publish,Author,Author_detail class BookConfig(admin.ModelAdmin): def show_authors(self,obj): print("obj",obj) return ‘|‘.join([obj.name for obj in obj.author.all()]) # 用於展示 list_display = [‘title‘,‘price‘,‘pub_date‘,‘publish‘,‘show_authors‘,‘staes‘] # 用於設置連接的內容 list_display_links = [‘title‘,‘price‘] #action操作 # 價格初始化 def patch_init(self,request,queryset): print(‘queryset‘,queryset) queryset.update(price=0) patch_init.short_description = ‘價格初始化‘#設置多選服務 # 出版狀態初始化 def states_status(self,request,queryset): queryset.update(staes=2) states_status.short_description =‘出版狀態初始化‘ # 多選服務 actions = [patch_init,states_status] #多重過濾 list_filter = [‘publish‘,‘author‘] # 排序 ordering = [‘price‘,‘-id‘] # 模糊查詢 search_fields = [‘title‘,‘price‘] class PublishConfig(admin.ModelAdmin): list_display = [‘name‘,‘city‘,‘email‘] class AuthorConfig(admin.ModelAdmin): def show_tel(self,obj): print(‘obj‘,obj) return obj.au_detail.tel def show_address(self,obj): print(‘obj‘,obj) return obj.au_detail.address list_display = [‘name‘,‘age‘,‘show_tel‘,‘show_address‘] admin.site.register(Book,BookConfig) admin.site.register(Publish,PublishConfig) admin.site.register(Author,AuthorConfig) admin.site.register(Author_detail)admin整體代碼
1.9 其他操作
1.9.1 list_display,列表時,定制顯示的列。
@admin.register(models.UserInfo) class UserAdmin(admin.ModelAdmin): list_display = (‘user‘, ‘pwd‘, ‘xxxxx‘) def xxxxx(self, obj): return "xxxxx"
1.9.2 list_display_links,列表時,定制列可以點擊跳轉。
@admin.register(models.UserInfo) class UserAdmin(admin.ModelAdmin): list_display = (‘user‘, ‘pwd‘, ‘xxxxx‘) list_display_links = (‘pwd‘,)1.9.3 list_filter,列表時,定制右側快速篩選。
1.9.4 list_select_related,列表時,連表查詢是否自動select_related
1.9.5 list_editable,列表時,可以編輯的列
@admin.register(models.UserInfo) class UserAdmin(admin.ModelAdmin): list_display = (‘user‘, ‘pwd‘,‘ug‘,) list_editable = (‘ug‘,)
1.9.6 search_fields,列表時,模糊搜索的功能
@admin.register(models.UserInfo) class UserAdmin(admin.ModelAdmin): search_fields = (‘user‘, ‘pwd‘)
1.9.7 date_hierarchy,列表時,對Date和DateTime類型進行搜索
@admin.register(models.UserInfo) class UserAdmin(admin.ModelAdmin): date_hierarchy = ‘ctime‘1.9.8 inlines,詳細頁面,如果有其他表和當前表做FK,那麽詳細頁面可以進行動態增加和刪除
class UserInfoInline(admin.StackedInline): # TabularInline extra = 0 model = models.UserInfo class GroupAdminMode(admin.ModelAdmin): list_display = (‘id‘, ‘title‘,) inlines = [UserInfoInline, ]
1.9.9 action,列表時,定制action中的操作
@admin.register(models.UserInfo) class UserAdmin(admin.ModelAdmin): # 定制Action行為具體方法 def func(self, request, queryset): print(self, request, queryset) print(request.POST.getlist(‘_selected_action‘)) func.short_description = "中文顯示自定義Actions" actions = [func, ] # Action選項都是在頁面上方顯示 actions_on_top = True # Action選項都是在頁面下方顯示 actions_on_bottom = False # 是否顯示選擇個數 actions_selection_counter = True
1.9.10 定制HTML模板
add_form_template = None change_form_template = None change_list_template = None delete_confirmation_template = None delete_selected_confirmation_template = None object_history_template = None
1.9.11 raw_id_fields,詳細頁面,針對FK和M2M字段變成以Input框形式
@admin.register(models.UserInfo) class UserAdmin(admin.ModelAdmin): raw_id_fields = (‘FK字段‘, ‘M2M字段‘,)
1.9.12 fields,詳細頁面時,顯示字段的字段
@admin.register(models.UserInfo) class UserAdmin(admin.ModelAdmin): fields = (‘user‘,)1.9.13 exclude,詳細頁面時,排除的字段
@admin.register(models.UserInfo) class UserAdmin(admin.ModelAdmin): exclude = (‘user‘,)1.9.14 readonly_fields,詳細頁面時,只讀字段
@admin.register(models.UserInfo) class UserAdmin(admin.ModelAdmin): readonly_fields = (‘user‘,)
1.9.15 fieldsets,詳細頁面時,使用fieldsets標簽對數據進行分割顯示
@admin.register(models.UserInfo) class UserAdmin(admin.ModelAdmin): fieldsets = ( (‘基本數據‘, { ‘fields‘: (‘user‘, ‘pwd‘, ‘ctime‘,) }), (‘其他‘, { ‘classes‘: (‘collapse‘, ‘wide‘, ‘extrapretty‘), # ‘collapse‘,‘wide‘, ‘extrapretty‘ ‘fields‘: (‘user‘, ‘pwd‘), }), )1.9.16 細頁面時,M2M顯示時,數據移動選擇(方向:上下和左右)
@admin.register(models.UserInfo) class UserAdmin(admin.ModelAdmin): filter_vertical = ("m2m字段",) # 或filter_horizontal = ("m2m字段",)
1.9.17 ordering,列表時,數據排序規則
@admin.register(models.UserInfo) class UserAdmin(admin.ModelAdmin): ordering = (‘-id‘,) 或 def get_ordering(self, request): return [‘-id‘, ]1.9.18 radio_fields,詳細頁面時,使用radio顯示選項(FK默認使用select)
radio_fields = {"ug": admin.VERTICAL} # 或admin.HORIZONTAL
1.9.19 form = ModelForm,用於定制用戶請求時候表單驗證
from app01 import models from django.forms import ModelForm from django.forms import fields class MyForm(ModelForm): others = fields.CharField() class Meta: model = models = models.UserInfo fields = "__all__" @admin.register(models.UserInfo) class UserAdmin(admin.ModelAdmin): form = MyForm
1.9.20 empty_value_display = "列數據為空時,顯示默認值"
@admin.register(models.UserInfo) class UserAdmin(admin.ModelAdmin): empty_value_display = "列數據為空時,默認顯示" list_display = (‘user‘,‘pwd‘,‘up‘) def up(self,obj): return obj.user up.empty_value_display = "指定列數據為空時,默認顯示"
2. admin 源碼解析
a
Django-CRM項目學習(一)-admin組件