阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

后台管理-xadmin

112次阅读
没有评论

共计 6672 个字符,预计需要花费 17 分钟才能阅读完成。

一、特点与解释

  • Xadmin 介绍

    直接替换掉 Django 自带的 admin 系统,并提供了很多有用的东西;完全的可扩展的插件支持,基于 Twitter Bootstrap 的漂亮 UI

    本课程使用版本为:python3.7+Django2.2.3+xadmin2

  • Xadmin 特点

    • 完全替代 Django admin
    • 支持基于 Twitter Bootstrap 的 UI 主题
    • 支持可扩展的插件
    • 更好的过滤器,日期范围,数量范围等
    • 内置 xls,csv,xml 和 json 格式数据导出
    • 仪表板页面和小部件支持
    • 现场书签
    • 完整的 CURD 方法(增删改查)

二、xadmin 安装与配置

  • 安装

    pip install xadmin2

  • 配置 settings.py

    INSTALLED_APPS = [ .... 'xadmin', 'crispy_forms', ] # 修改使用中文界面 LANGUAGE_CODE = 'zh-Hans' # 修改时区 TIME_ZONE = 'Asia/Shanghai'
  • 配置路由

    import xadmin urlpatterns = [# path('admin/', admin.site.urls), path('xadmin/', xadmin.site.urls), ]
  • 执行迁移 创建 xadmin 所需表

    python manage.py migrate

  • 创建用户

    python manage.py createsuperuser

三、模型类

  • 班级表

    from django.db import models # Create your models here. # 班级表 class Grades(models.Model): gname = models.CharField(max_length=15, verbose_name='班级名称') gnum = models.IntegerField(verbose_name='班级总人数') ggirlnum = models.IntegerField(verbose_name='女生人数') gboynum = models.IntegerField(verbose_name='男生人数') isDelete = models.BooleanField(default=False, verbose_name='是否删除') def __str__(self): return self.gname class Meta: db_table = 'grades'
  • 学生表

    # 学生表 class Students(models.Model): sname = models.CharField(max_length=10, verbose_name='学生名字') ssex = models.BooleanField(default=True, verbose_name='性别') sage = models.IntegerField(default=20, verbose_name='年龄') sgrade = models.ForeignKey(Grades, on_delete=models.CASCADE, verbose_name='班级') isDelete = models.BooleanField(default=False, verbose_name='是否删除') join = models.DateField(auto_now_add=True) def __str__(self): return self.sname class Meta: db_table = 'students'

四、Xadmin 使用

  • 增加用户组件报错解决

    原因:render 函数在 django2.1 上有变化

    解决方案:

    • 在 Python 终端输入命令 help(‘xadmin’) 查看 xadmin 安装位置 得到如下输出

      FILE /Users/xialigang/Desktop/do_xadmin/venv/lib/python3.7/site-packages/xadmin/__init__.py
    
    
  • 进入 xadmin 安装路径,编辑 xadmin/views/dashboard.py

    36 #render() got an unexpected keyword argument 'renderer' 37 # 修改 bug, 添加 renderer 38 def render(self, name, value, attrs=None, renderer=None):
  • 设置 app 标题

    App/apps.py

    rom django.apps import AppConfig class AppConfig(AppConfig): # app 名 name = 'App' verbose_name = '模型管理'
  
App/\_\_init_\_.py
  
  ```python
  default_app_config='App.apps.AppConfig'

后台管理 -xadmin

  • 站点的全局配置

    主题配置

    • enable_themes = True 开启主题切换功能
  • use_bootswatch = True 支持切换主题

    全局配置

  • site_title =“lucky 后台管理系统”设置站点标题

  • site_footer =“lucky 底部栏”设置站点的页脚

  • menu_style =“accordion”设置菜单折叠,在左侧,默认的

    • global_search_models = [Grades, Students] 设置全局搜索模型
  • global_models_icon 设置 models 的全局图标

    global_models_icon = {Grades: "glyphicon glyphicon-user", Students: "fa fa-cloud" }

实例

import xadmin from xadmin import views class BaseSetting(object): """xadmin 的基本配置""" enable_themes = True # 开启主题切换功能 use_bootswatch = True # 支持切换主题 xadmin.site.register(views.BaseAdminView, BaseSetting) class GlobalSettings(object): """xadmin 的全局配置""" site_title = "lucky 后台管理系统" # 设置站点标题 site_footer = "lucky 底部栏" # 设置站点的页脚 menu_style = "accordion" # 设置菜单折叠,在左侧,默认的 global_search_models = [Grades, Students] # 设置 models 的全局图标, Grades, Students 为模型类名 global_models_icon = {Grades: "glyphicon glyphicon-user", Students: "fa fa-cloud" } xadmin.site.register(views.CommAdminView, GlobalSettings)
  • 模型类配置属性与实例

    • 菜单的图标

      model_icon

      model_icon = 'fa fa-image'
    • 列表显示内容

      list_display

      list_display = ('pk', 'gname', 'gnum', 'ggirlnum', 'gboynum', 'isDelete')
    • 设置默认可编辑字段

      list_display_links

      list_display_links = ('gname', 'gnum')
    • 分页显示

      list_per_page

      list_per_page = 2
    • 显示数据详情

      show_detail_fields

      show_detail_fields = ['gname']
    • 指定列表页的数据定时刷新

      refresh_times

      refresh_times=(3,5) # 3/ 5 秒进行刷新
    • 该指定可以过滤的列的名字, 系统会自动生成搜索器

      list_filter

      list_filter = ('gname',)
    • 表单显示内容

      fields

      fields = ('gname', 'gnum', 'ggirlnum', 'gboynum', 'isDelete')
    • 搜索字段

      search_fields

      search_fields = ('gname', 'gnum' )
    • 模型类配置使用实例

      from App.models import Grades, Students class GradesAdmin(object): # 菜单的图标 model_icon = 'fa fa-image' # 列表显示内容 list_display = ('pk', 'gname', 'gnum', 'ggirlnum', 'gboynum', 'isDelete') # 设置默认可编辑字段 list_display_links = ('gname', 'gnum') # 分页显示 list_per_page = 2 # 显示数据详情 show_detail_fields = ['gname'] # 3/ 5 秒进行刷新 refresh_times=(3,5) # 过滤器 list_filter = ('gname',) # 表单显示内容 fields = ('gname', 'gnum', 'ggirlnum', 'gboynum', 'isDelete') # 搜索字段 search_fields = ('gname', 'gnum' ) xadmin.site.register(Grades, GradesAdmin) class StudentsAdmin(object): # 菜单的图标 model_icon = 'fa fa-image' # 列表显示内容 list_display = ('pk','sname', 'ssex', 'sage', 'sgrade') # list_display_links 设置默认可编辑字段 list_display_links = ('sname', 'sage') # 分页显示 list_per_page = 2 # 过滤器 list_filter = ('sname',) # 表单显示内容 fields = ('sname','ssex', 'sage', 'sgrade', 'isDelete') # 搜索字段 search_fields = ('sname', 'sage' ) xadmin.site.register(Students, StudentsAdmin)
  • 图表主要属性

    • title 图表的显示名称
    • x-field 图表的 X 轴数据列, 一般是日期, 时间等
    • y-field 图表的 Y 轴数据列, 该项是一个 list, 可以同时设定多个列, 这样多个列的数据会在同一个图表中显示
    • order 排序信息, 如果不写则使用数据列表的排序

    配置 students 走势展示图表

    class StudentsAdmin(object): ... data_charts = {"students_count": {'title': "Students Register Charts", "x-field": "join", "y-field": ("id",), "order": ('join',)}, }

后台管理 -xadmin

  • 自定义导航菜单顺序

    class GlobalSettings(object): """xadmin 的全局配置""" ... # 菜单顺序 def get_site_menu(self): return ({'title': '模型管理', 'menus': ({'title': '班级信息', 'url': self.get_model_url(Grades, 'changelist'), 'icon': 'glyphicon glyphicon-user'}, {'title': '学生信息', 'url': self.get_model_url(Students, 'changelist'), 'icon':'fa fa-cloud'}, )}, ) xadmin.site.register(views.CommAdminView, GlobalSettings)

    注意:参数 changelist 为固定值

后台管理 -xadmin

  • 设置只读字段

    说明:在使用 xadmin 的时候,ModelAdmin 默认只有对于 model 的增删改查,但是总是有些字段是不希望用户来编辑的。而 readonly_fields 设置之后不管是 admin 还是其他用户都会变成只读,而我们通常只是想限制普通用户。这时我们就可以通过重写 get_readonly_fields 方法来实现对特定用户的只读显示

    class StudentsAdmin(object): ... def get_readonly_fields(self, **kwargs): """重新定义此函数,限制普通用户所能修改的字段""" print(self.org_obj) if self.user.is_superuser: self.readonly_fields = [] return self.readonly_fields readonly_fields = ('sname',)
  • list_display 使用自定义函数

    需求:性别改为男女

    class StudentsAdmin(object): # 菜单的图标 model_icon = 'fa fa-image' def gender(self, obj): if obj.ssex: return "男" else: return "女" gender.short_description = '性别' # 列表显示内容 list_display = ('pk','sname', 'gender', 'sage', 'sgrade') ...

后台管理 -xadmin

  • inlines 机制

    说明:如果想添加数据的同时方便添加关联 model,inlines 机制 同一个页面 可以添加 所有的相关信息

    需求:在添加班级的时候添加几个学生

    class StudentsInline: model = Students # 要添加数据关联模型 extra = 2 # 添加数据的条数 class GradesAdmin(object): inlines = [StudentsInline]

    注意:还可以在修改班级的时候修改对应关联模型的数据

    添加数据

后台管理 -xadmin
修改数据

后台管理 -xadmin

  • 重载修改显示样式

    说明:在要改变数据时候样式的模型类 Admin 添加如下代码

    class StudentsAdmin(object): ... def get_form_layout(self): if self.org_obj: self.form_layout = ( Main(Fieldset('', 'sname', css_class='unsort no_title' # 没有标题 ), Fieldset(('基本信息'), Row('ssex', 'sage'), # 显示在一行 'email' ), Fieldset(('班级信息'), 'sgrade' ), ), Side(# 侧面展示 Fieldset(('Status'), 'isDelete' ), ) ) return super().get_form_layout()

后台管理 -xadmin

  • 模型编辑页面 Field 分区显示–form_layout

    在 admin.py 中我们可以通过 Fieldsets 去设置字段的分块显示
    界面显示会上下分区,分为名字为空和名字为其它的两个区域。

    而在 xadmin.py 中,这个字段不再生效,需用 form_layout 去设置。

    可分为 Main 主区域和 Side 侧边区域,Main 或 Side 中又可通过 Fieldset 再分多个区域。Fieldset 为一个元组,第一个字段为需要设置的名称,其它字段均为模型中的字段名

    如下:

    class StudentsAdmin(object): ... form_layout = ( Main(Fieldset('基础信息', 'sname'), Fieldset('EXTRA', 'ssex', 'sage', 'sgrade'), ), Side(Fieldset('其它', 'isDelete'), ) )

    注意:如果 form_layout 与 get_form_layout 同时存在 则 form_layout 仅在添加数据的时候进行分区样式展示 如果 get_form_layout 不存在 则添加与修改都进行分区显示

后台管理 -xadmin

  • 增加页面显示列的跳转

    显示自定义的 html 代码

    models.py

    class Grade(models.Model): . . . def go_to(self): from django.utils.safestring import mark_safe # mark_safe 后就不会转义 return mark_safe("<a href='http://www.baidu.com'> 跳转 </a>") go_to.short_description = "跳转"

    admin.py

    class GradeAdmin(object): list_display = ['go_to']

后台管理 -xadmin

正文完
星哥说事-微信公众号
post-qrcode
 
星锅
版权声明:本站原创文章,由 星锅 2022-05-26发表,共计6672字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中