1. 程式人生 > >xadmin開發後臺管理系統

xadmin開發後臺管理系統

#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 = '使用者套餐'