xadmin开发后台管理系统
2018-11-09 本文已影响0人
lm_is_dc
Xadmin开发后台管理系统
添加小头像
https://blog.csdn.net/qq_34964399/article/details/80303544?utm_source=blogxgwz5
导航栏设置
https://www.cnblogs.com/adc8868/p/7506973.html
管理器常用显示设置
https://blog.csdn.net/weixin_33127753/article/details/80897240
添加插件
比如要做一个二级联动过滤查询数据,查找当前用户所办的套餐。
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文件夹下的<u style="box-sizing: border-box;"></u>init<u style="box-sizing: border-box;"></u>.py中PLUGINS = ()元组中添加linkDataFilter
%5CUsers%5CLDCPC%5CAppData%5CRoaming%5CTypora%5Ctypora-user-images%5C1541747845932.png3、写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)
%5CUsers%5CLDCPC%5CAppData%5CRoaming%5CTypora%5Ctypora-user-images%5C1541748764825.png
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
6、models.py
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 = '用户套餐'