jianfen's blog

Information is beautiful

Django原生后台非常不友好,一般人的习惯是左右结构的系统,寻找了很久发现xadmin还是符合要求,搭建的时候要走一些坑

Django-xadmin

https://github.com/sshwsfc/xadmin

0x01 环境搭建

创建完成项目后在github下源码,最好使用pip install django-xadmin


因为这样会解决很多依赖问题可以安装完成之后再将源码放入项目文件夹内,在删除django-xadmin


pip uninstall django-xadmin这样就会保留依赖包


首先要设置urls.py文件注释原来的admin用xadmin替换然后import xadmin并设置URL目录
url(r'^xadmin/', xadmin.site.urls),
在settings.py中的INSTALLED_APPS包含'xadmin'和 'crispy_forms'


如果将xadmin包放入指定文件夹内需要在项目文件夹中的settings.py下设置
sys.path.insert(0, os.path.join(BASE_DIR, "extra_apps"))这样项目就可以找到文件夹内所有app


python manage.py runserver
访问 http://127.0.0.1:8000/xadmin

成功:

0x02 xadmin字段优化和修改

首先后台存在一个User APP 去继承系统内部的AbstractUser.在APP目录下新建adminx.py用于注册xadmin的后台管理表(增删改查)

class GlobalSetting(object):
# 设置系统左上角名字
site_title = '管理平台 v.1.0'
# 设置系统底部名字
site_footer = '版权所有'
#左侧导航收缩模式
menu_style = "accordion"

class UserDepartmentAdmin(object):
    list_display = ['department_name']
    #设置导航栏图标
    model_icon = "fa fa-sitemap"
#注册到后台
xadmin.site.register(views.CommAdminView, GlobalSetting)
xadmin.site.register(views.BaseAdminView, BaseSetting)

如果是User继承系统则在xadmin->plugins->auth.py->class UserAdmin(object)修改因为继承的类在系统内已经被注册了其他APP需要自行注册

以下操作全在每个APP下面的adminx.py中的自定义类操作
分析一些字段用法:
#后台列表显示的字段
list_display = ('username','real_name', 'email', 'mobile', 'department', 'is_staff')
#过滤器可过滤字段
list_filter = ('username', 'real_name', 'email', 'mobile', 'is_staff', 'is_superuser', 'is_active')
#搜索栏可搜索字段
search_fields = ('username', 'email', 'mobile')
#设置只读字段
readonly_fields = ('vul_name', 'add_time', 'vul_grade', 'vul_url', 'vul_source', 'vul_type', 'vul_count', 'vul_control', 'vul_detail', 'vul_department')
#设置ajax方式在显示列表就可修改参数
list_editable = ['vul_status']
#列表字段每页15个
list_per_page = 15
#列表可导出类型
list_export = ('xls', 'xml', 'json')
#首要排序字段
ordering = ('username',)


#在修改表单字段时排除一些字段比如User表中的姓和名字段
exclude = ('first_name', 'last_name')
#在添加信息时可显示被添加的字段
fields = ('username', 'mobile', 'email', 'real_name', 'department')

0x03 权限控制

现在有如下需求:
当我在登录一个部门权限(非管理员)我只能显示自己部门的漏洞,在adminx.py下判断当前用户是否为管理员如果不是管理员过滤当前用户的部门漏洞

def get_list_queryset(self):
        # self.user.id获取当前登陆用户的id
        # 判断权限,如果是超级管理员不进行过滤
    if not self.user.is_superuser:
        return super(VulProfileAdmin, self).get_list_queryset().filter(vul_department=self.user.department_id)
    return super(VulProfileAdmin, self).get_list_queryset()
def get_readonly_fields(self):
    """  可以限制如果不是管理员则修改一些字段时会变成只读权限  """
    if self.user.is_superuser:
        self.readonly_fields = []
    return self.readonly_fields

readonly_fields = ('vul_name', 'add_time', 'vul_grade', 'vul_url', 'vul_source',
                   'vul_type', 'vul_count', 'vul_control', 'vul_detail', 'vul_department'
                   )

0x05 美化操作

因为后台TextField字段显示非常大
在adminx.py中添加formfield_overrides

修改后台textarea的宽高
    formfield_overrides = {
        models.TextField: {'widget': Textarea(
            attrs={
                    'style': 'width:50%',
                   })},
    }

添加新评论 »

在这里输入你的评论...

勿忘初心,方得始终.