xadmin開發後臺管理系統
阿新 • • 發佈:2018-12-20
#Xadmin開發後臺管理系統
##新增小頭像
導航欄設定
管理器常用顯示設定
新增外掛
比如要做一個二級聯動過濾查詢資料,查詢當前使用者所辦的套餐。
###1、新增linkageFilter.py檔案
在虛擬環境中找到/Lib/site-packages/xadmin/plugins,在該資料夾下新增一個linkDataFilter.py檔案,內容如下:
from xadmin.views import BaseAdminPlugin, DeleteAdminView from xadmin.views.edit import CreateAdminView, UpdateAdminView import xadmin # 點選增加記錄時觸發 class LinkageAddFilter(BaseAdminPlugin): # 預設不載入,只在需要載入的options中設定True來載入 is_execute = False def init_request(self,*arg,**kwargs): # return self.bool(is_execute) return self.is_execute def get_media(self, media): # 此處用來加入我們自己的js檔案 media = media + self.vendor("xadmin.self.select.js") return media # 點選更新記錄時觸發 class LinkageUpdateFilter(BaseAdminPlugin): # 預設不載入,只在需要載入的options中設定True來載入 is_execute = False def init_request(self,*arg,**kwargs): # return self.bool(is_execute) return self.is_execute def get_media(self, media): # 此處用來加入我們自己的js檔案 media = media + self.vendor("xadmin.self.update_select.js") return media # 點選刪除記錄時觸發 class LinkageDeleteFilter(BaseAdminPlugin): # 預設不載入,只在需要載入的options中設定True來載入 is_execute = False def init_request(self,*arg,**kwargs): # return self.bool(is_execute) return self.is_execute def get_media(self, media): # 此處用來加入我們自己的js檔案 media = media + self.vendor("xadmin.self.delete.js") return media xadmin.site.register_plugin(LinkageAddFilter, CreateAdminView) xadmin.site.register_plugin(LinkageUpdateFilter, UpdateAdminView) xadmin.site.register_plugin(LinkageDeleteFilter, DeleteAdminView)
###2、在plugins資料夾下的init.py中PLUGINS = ()元組中新增linkDataFilter
3、寫js檔案
在虛擬環境中找到/Lib/site-packages/xadmin/static/xadmin/js,在該資料夾下條件xadmin.self.select.js、xadmin.self.update_select.js和xadmin.self.delete_select.js三個檔案
其中xadmin.self.select.js內容如下:
(function($){ function linkage_query(){ // 獲取使用者辦的套餐 $("#div_id_package").click(function () { // 從導航欄處獲取使用者名稱 var master_name = $('#top-nav').find('strong').text(); master_name = master_name.substring(4); url = "selectInfo/?master=" + master_name; getSecNav(url,'#id_package'); }); function getSecNav(url,id_type){ $.ajax({ type:"GET", url:url, async:true, beforeSend:function(xhr){ xhr.setRequestHeader("X-CSRFToken", $.getCookie("csrftoken")) }, success:function(data){ $(id_type)[0].selectize.clearOptions(); //二級select清空選項 keys = Object.keys(data);//將JSON轉換); for (var i = 0; i < keys.length; i++) { console.log(data[i]); var item = data[keys[i]]; var test = {text: item.name, value: item.value, $order: i + 1}; //遍歷資料,拼湊出selectize需要的格式 $(id_type)[0].selectize.addOption(test); //新增資料 } }, error:function(xhr){ console.log(xhr); } }); } } linkage_query(); })(jQuery)
4、urls.py和views.py處理js發起的請求
5、adminx.py配置
# 使用者管理 class UserManageAdmin(object): list_display = ['id', 'name','addtime','get_UserManage_Taocan' ] search_fields = ['name'] list_filter = ['phone',] ordering = ['-id'] # 進入xadmin頁面將某個欄位倒序排列 readonly_fields = ['addtime'] # 只讀欄位,不能編輯 # exclude = ['money'] # 不顯示的欄位 list_editable = ['name', ] # 即使編輯器 relfield_style = 'level' # 帶有外來鍵的欄位變成搜尋格式 model_icon = 'fa fa-user' # 表左邊的圖示 is_execute = True # 使用js外掛 # 禁止頁面批量刪除 def has_delete_permission(self,*args,**kwargs): if args: return True return False # 自動新增管理員 def save_models(self): self.new_obj.user = self.request.user super().save_models() # 設定使用者只能檢視自己填寫的資料 def queryset(self): qs = super(UserManageAdmin, self).queryset() if self.request.user.is_superuser: # 超級使用者可檢視所有資料 return qs else: que = qs.filter(user=self.request.user) return que
from django.db import models
from django.utils.safestring import mark_safe
from xadmin.plugins.auth import User
# 使用者管理
class UserManage(models.Model):
name = models.CharField(max_length=20, blank=True, null=True, verbose_name='使用者名稱')
phone = models.CharField(max_length=11, unique=True, verbose_name='手機號')
money = models.DecimalField(max_digits=20, decimal_places=2,default=0, verbose_name='餘額')
addtime = models.DateTimeField(auto_now_add=True, verbose_name='註冊時間')
user = models.ForeignKey(User, on_delete=models.CASCADE, editable=False, null=True, verbose_name='管理員')
# 顯示時增加一列,比如顯示使用者辦的卡
def get_UserManage_Taocan(self):
text = '增加一列</br>'
# mark_safe允許換行
return mark_safe(text)
get_UserManage_Taocan.short_description = '使用者套餐'