一、安装配置

1.xadmin的安装
下载zip源码
https://github.com/sshwsfc/xadmin/tree/django2
pip install xadmin-django2.zip

2.配置settings
xadmin的Form和页面是基于crispy_forms来实现的

INSTALLED_APPS = [# 省略'xadmin','crispy_forms',]

二、配置adminx.py

1.注册后台实体类,将APP下的 admin.py改名为 adminx.py

  1. 自定义过滤器
from xadmin.layout import Row, Fieldset, Container
from xadmin.filters import RelatedFieldListFilter
import xadmin# xadmin自定义过滤器:通过字段名的检测动态创建对应的过滤器
class CategoryOwnerFilter(RelatedFieldListFilter):# 设置当前过滤器需要处理的字段@classmethoddef test(cls, field, request, params, model, admin_view, field_path):return field.name == 'category'def __init__(self, field, request, params, model, model_admin, field_path):super().__init__(field, request, params, model, model_admin, field_path)# 该值默认是查询所有数据,此时进行重新赋值,根据owner进行过滤self.lookup_choices = Category.objects.filter(owner=request.user).values_list('id', 'name')
  1. 抽象出的数据处理的基类 base_admin.py
# xadmin中保存数据和查询数据的接口名发生了变化
# 在xadmin中数据都可通过self对象获取到
class BaseOwnerAdmin(object):"""1.自动补充文章,分类,标签等编辑页面保存时自动保存owner字段2.针对queryset过滤当前用户的数据"""exclude = ('owner', )    # 设置编辑页中不显示owner字段# 保存数据到数据库中时自动给owner字段赋值def save_models(self):self.new_obj.owner = self.request.userreturn super().save_models()# 设置列表页仅显示当前登陆用户的信息def get_list_queryset(self):request = self.requestqs = super().get_list_queryset()return qs.filter(owner=request.user)
  1. xadmin后台实体类的注册
from xadmin.filters import manager
# 将过滤器注册到过滤器管理器中,并设置优先权,这样页面加载时会使用我们自定义的过滤器
manager.register(CategoryOwnerFilter, take_priority=True)# 注册xadmin后台显示的实体类
@xadmin.sites.register(Post)
class PostAdmin(BaseOwnerAdmin):# 修改编辑页面中form表单元素的样式form = PostAdminForm# operator 为自定义的显示字段list_display = ('title', 'status', 'category', 'owner', 'created_time', 'operator')# 定义可点击进入编辑页面的字段,不写的话默认为第一个list_display_links = []# xadmin自定义过滤器,此处使用字段名,而不是过滤器的类名list_filter = ['category']# 定义搜索字段,此处category为外键,双下划线指定关联Category类中的name字段search_fields = ['title', 'category__name']# 在对应的字段数据上显示一个详情的接口show_detail_fields = ['record_time',]# 提供一个自动刷新的接口:可选择5s或10s刷新refresh_times = (5, 10)# 导出模型数据类型,这个默认支持4种导出类型list_export = ('xls', 'xml', 'json')# 导出字段# list_export_fields = ()# 根据数据绘制图表,显示在列表页上方data_charts = {"summary": {'title': u"余额","x-field": "record_time","y-field": ("summary", 'balance', 'debt'),  # 支持多条数据线},}# 动作相关的配置,是否展示在顶部和底部actions_on_top = Trueactions_on_bottom = True# 开启顶部的编辑按钮save_on_top = True# xadmin关于编辑页的布局设置form_layout = (Fieldset('基础信息', 'username', 'password', 'phone'),Fieldset('个人信息', Row('nickname', 'avatar'), 'sex', 'address',),Fieldset('权限', 'is_active'),)# 编辑页不显示的字段exclude = ['last_login']# 设置字段横向或纵向展示filter_horizontal = ('tag',)# 定义 自定义显示字段的方法,返回值显示在列表页中def operator(self, obj):return format_html('<a href="{}">编辑</a>', reverse('xadmin:blog_post_change', args=(obj.id,)))# 也可使用xadmin提供的接口# return format_html(#     '<a href="{}">编辑</a>', self.model_admin_url('change', obj.id)# )# 显示自定义显示字段的名称operator.short_description = '操作'# xadmin关于静态资源Media的配置,此写法可兼容admin# @property# def media(self):#     # xadmin是基于bootstrap的,引入会导致页面样式冲突,此处仅做演示#     media = super().media#     media.add_js(['https://cdn.jsdelivr.net/gh/bootcdn/BootCDN/ajax/libs/bootstrap/4.0.0-beta.2/js/bootstrap.bundle.js'])#     media.add_css({#         'all': ('http://cdn.bootcss.com/bootstrap/4.0.0-beta.2/css/bootstrap.min.css',),#     })#     return media
  1. 关于用户类
    如果是自定义的User类,配置参照上方
    xadmin默认已经注册了自带的User类,如果需要自定义显示则需要先注销,再注册
xadmin.site.unregister(get_user_model())
xadmin.site.register(get_user_model(), UserInfoXAdmin)
  1. 重写xadmin中数据处理的方法
    过滤数据的方法:get_list_queryset
    保存数据的方法:save_models
    删除数据时触发的方法:delete_models

示例:删除数据时自动删除本地的图片,重写delete_models

@xadmin.sites.register(GoodsType)
class GoodsTypeXAdmin(object):list_display = ('name', 'image_img', 'count')search_fields = ("name",)def count(self, obj):return GoodsInfo.objects.filter(type=obj).count()count.short_description = '商品总数'# xadmin中删除数据时调用的方法,在此处删除本地的图片文件# 很奇怪,xadmin没有直接调用model中的delete方法def delete_models(self, queryset):for item in queryset:# 去掉路径中开头的/,不然os拼接的时候会有问题origin_img = item.image.url[1:]thumbnail_img = item.image.thumbnail.url[1:]# 这里有个坑,os拼接的时候,第二个路径不能是绝对路径,不然会忽略第一个路径参数origin_img_path = os.path.join(BASE_DIR, origin_img)thumbnail_img_path = os.path.join(BASE_DIR, thumbnail_img)if os.path.exists(origin_img_path):os.remove(origin_img_path)if os.path.exists(thumbnail_img_path):os.remove(thumbnail_img_path)return super().delete_models(queryset)

三、其余配置

xadmin不支持多站点的配置
xadmin自带log功能,因此不用单独配置
1.配置url

import xadminurlpatterns = [# 省略url(r'^admin/', xadmin.site.urls, name='xadmin'),   # 设置为xadmin站点
]

2.site title和site footer的处理
settings.py中定义系统名称和footer

# 设置xadmin的系统标题和底部展示信息
XADMIN_TITLE = 'BlogType管理后台'
XADMIN_FOOTER_TITLE = 'power by Master-Sun'

3.全局样式配置 (写在某个应用下的adminx.py 中)

# xadmin的全局配置
from xadmin import views# 开启主题切换,这个弄了之后响应挺慢的
# class BaseSetting(object):
#     enable_themes = True
#     use_bootswatch = True
#
# xadmin.site.register(views.BaseAdminView, BaseSetting)# 全局配置
class GlobalSettings(object):# 修改titlesite_title = 'OfferHelp个人自助平台'# 修改footersite_footer = 'power by Master-Sun'# 设置左侧的菜单有下拉菜单的效果menu_style = 'accordion'# 设置左侧菜单栏实体类对应的图标global_search_models = (FinanceRecord,)# 设置对应的图标,图标参考:https://v3.bootcss.com/components/#glyphicons-glyphsglobal_models_icon = {FinanceRecord: "glyphicon glyphicon-check"}# 将全局配置信息进行注册
xadmin.site.register(views.CommAdminView,GlobalSettings)

4.更改app在左侧菜单栏的显示名称

# 修改对应app下的apps.py
from django.apps import AppConfigclass UserConfig(AppConfig):name = 'user'verbose_name = '用户管理'# 在对应app的初始化文件__init__.py中添加如下内容
default_app_config = 'user.apps.UserConfig'

5.新增用户小组件报错

D:\workspace\project_env\OfferHelp-env\Lib\site-packages\xadmin\views\dashboard.py
36行:def render(self, name, value, attrs=None):
改为:36行:def render(self, name, value, attrs=None, renderer=None):

参考:《Django企业开发实战》
https://www.cnblogs.com/lyq-biu/p/9513888.html

Django博客开发5----xadmin相关推荐

  1. Django 博客开发教程 6 - 真正的 Django 博客首页视图

    在此之前我们已经编写了 Blog 的首页视图,并且配置了 URL 和模板,让 Django 能够正确地处理 HTTP 请求并返回合适的 HTTP 响应.不过我们仅仅在首页返回了一句话:欢迎访问我的博客 ...

  2. Django 博客开发教程 8 - 博客文章详情页

    首页展示的是所有文章的列表,当用户看到感兴趣的文章时,他点击文章的标题或者继续阅读的按钮,应该跳转到文章的详情页面来阅读文章的详细内容.现在让我们来开发博客的详情页面,有了前面的基础,开发流程都是一样 ...

  3. Django博客开发(十三)—一个简单的站内搜索

    最近在努力的翻译Apple的测试文档,英文差果然是一个硬伤. 背景 博客内容越来越多了,慢慢的发现有时候需要一个搜索引擎来处理一些搜索的要求.当然,不需要那么复杂的逻辑,我们的博客只需要一个很小很小的 ...

  4. 【Django博客开发教程】:数据查询 Article.objects.all()

    进行数据查询之前,我们需要先进入我们的管理后台,在里面添加一些数据.然后我们用Pycharm打开我们的数据库.具体操作方法:用Pycharm可视化操作数据库 我们的数据结构长这般模样: 双击blog_ ...

  5. Django 3.2.5博客开发教程:基础配置

    创建项目之后,我们需要对项目进行最基础的配置.这些配置是我们做项目的时候必须要配置的,所以我们先提前配置好. 我们打开myblog目录下的settings.py文件. 一.设置域名访问权限 myblo ...

  6. Django 3.2.5博客开发教程:HelloWorld欢迎页面

    基础配置做好了之后,我们就可以先迁移数据到数据库,然后启动我们的项目,感受Django的魅力. 在Pycharm左下角底部的Terminal,会弹出Terminal终端窗口,Pycharm自动会帮我们 ...

  7. Django 3.2.5博客开发教程:用Admin管理后台管理数据

    上节我们我们把数据库迁移到数据库里去了,那么现在我们数据库里是个什么样的情况呢?我们点击Pycharm右上角的Database,然后在网站项目里选中我们的数据库文件db.sqlite3,把它拖到Dat ...

  8. Django 3.2.5博客开发教程:URL与视图函数

    在讲URL与视图函数之前我们先给大家简单介绍一下用户访问网站的流程.我们访问一个网站的时候,一般先打开浏览器,然后在浏览器的地址栏里输入一个网址,也就是URL,然后回车,我们就可以在浏览器里看到这个网 ...

  9. Django 3.2.5博客开发教程:使用富文本编辑器添加数据

    在Django admin后台添加数据的时候,文章内容文本框想发布一篇图文并茂的文章需就得手写Html代码,这十分吃力,也没法上传图片和文件.这显然不是我等高大上程序猿想要的. 为提升效率,我们可以使 ...

最新文章

  1. 中国法院裁定:禁售部分型号苹果手机
  2. 环信 之 通信过程及聊天记录保存
  3. 13万张表+数亿行代码,迁移只需数小时,还是异构数据库
  4. 烂泥:NFS做存储与KVM集成
  5. 非线性最小二乘通俗易懂解释
  6. Android学习系列(一)初识安卓
  7. 三个点在同一个半圆的概率_圆中四鸭属于一个半圆的概率
  8. android滚动视图实例,android实现自定义滚动条
  9. Python 打印日志
  10. Mac系统最强虚拟机(支持Big Sur)
  11. 计算机科学和机器学习中的代数、拓扑、微积分和最优化理论
  12. Golang 中map与GC“纠缠不清”的关系
  13. 前端性能优化(四)——网页加载更快的N种方式
  14. Red Hat Linux9.0操作系统安装和配置入门
  15. Python提取信息测试
  16. USB 传输方式(控制)
  17. mysql三大日志_了解的mysql三大日志-----binlog
  18. 第 3 章 程序的机器级表示
  19. 2020年中国生态环境污染治理投资现状分析:环境污染治理投资总额为10638.9亿元[图]
  20. MPC5744-PIT

热门文章

  1. 关于计算机的名言英语作文,英语作文名言,英语作文万能结尾句子?
  2. Word文档怎么恢复?数据恢复软件靠谱吗?
  3. mysql 函数 截取_mysql函数之截取字符串
  4. EasyExcel 单元格替换
  5. 计算机专业中,为什么网络工程最不起眼、最不受推荐?
  6. 安卓OTG 安卓转串口 安卓手机与单片机通信 USB转串口
  7. 真实评测 i5 12500h和i5 12450h差距大不大
  8. swift-从零开始(1)swift项目的创建
  9. NHibernate冷知识一则——自动修补空属性的缺省值
  10. lrzsz命令的用法