1、安装过程中你会发现在git上面提供的是pip install xadmin,而在对应的文档上面提供的是pip install django-xadmin
但是这两者对于python3.6而言,其实都是错误的,你需要使用的是:
pip install git+git://github.com/sshwsfc/xadmin.git
最后pip会提示安装成功
2、但是你实际运行的时候又会发现,还缺少一个import_export的包
所以继续
pip install django-import-export
,安装成功以后,xadmin就算安装成功了。
3、然后在settings.py里面注册上
INSTALLED_APPS = (
...
'xadmin',
'crispy_forms',
'reversion',
...
4、在项目下面的urls.py里面进行替换
import xadmin
# url(r'^admin/', admin.site.urls),
url(r'^xadmin/', xadmin.site.urls),
5、在cmd中切到项目根目录下,运行:python manage.py makemigrations
6、5步骤后,继续运行:python manage.py migrate
7、然后在应用下写一个adminx.py文件,
import xadmin
xadmin.site.register(你的应用名)
其中需要注意的是search_fields中不要把时间字段加入,如果加了时间字段,在使用搜索功能的时候容易报错。
adminx.py中一般配置(即没有关联外键):
import xadmin
from .models import Course
class CourseAdmin(object):
list_display = ['name','desc','detail','degree','learn_times','students']
search_fields = ['name','desc','detail','degree','students']
list_filter = ['name','desc','detail','degree','learn_times','students']
xadmin.site.register(Course,CourseAdmin)
adminx.py中(若关联外键):
mport xadmin
from .models import Lesson
class LessonAdmin(object):
list_display = ['course','name','add_time']
# 因为course是外键,过滤器需要指定详细的外键字段才能在前端正确显示并且使用
search_fields = ['course__name','name']
#因为course是外键,过滤器需要指定详细的外键字段才能在前端正确显示
list_filter = ['course__name','name','add_time']
xadmin.site.register(Lesson,LessonAdmin)
users/adminx.py中(应该任意一个app都可以)。
from xadmin import views
#额外的主题修改
class BaseSetting(object):
enable_themes = True #表示使用主题功能
use_bootswatch = True
xadmin.site.register(views.BaseAdminView,BaseSetting)
#全局设置
from xadmin import views
class GlobalSettings(object):
site_title = 'XMJsystem' #Logo
site_footer = 'XMJ在线学习后台管理系统' #网页页脚信息
menu_style = 'accordion' #右侧导航栏折叠功能
该app下的apps.py中:
from django.apps import AppConfig
class OperationConfig(AppConfig):
name = 'operation'
verbose_name = u'用户操作'
该app下的__init__.py中:
default_app_config = 'operation.apps.OperationConfig'
# 数据展示
list_display = ['name','desc','detail','degree','learn_times','students','get_zj_nums','go_to']
# 查询
search_fields = ['name','desc','detail','degree','students']
# 筛选(后台管理页面中的过滤器)
list_filter = ['name','desc','detail','degree','learn_times','students']
# 自定义后台系统的icon
model_icon = 'fa fa-location-arrow' #这是第三方字体库,用最新的版本需要替换对应js和fonts文件
# 后台自定义默认排序
ordering = ['-click_nums']
# 后台自定义字段只可读
# readonly_fields = ['click_nums','fav_nums']
readonly_fields = ['click_nums']
# 后台自定义字段不显示
exclude = ['fav_nums'] #这里会跟readonly_fields冲突,所以readonly_fields的fav_nums去掉了,
# 后台自定义不是下拉选择框,而是搜索框(解决了为什么用户不是下拉框的问题。。)
relfield_style = 'fk-ajax'
# 后台直接在表上修改数据
list_editable = ['degree','desc']
# xadmin/plugins/refresh插件定时刷新页面
refresh_times = [10,60] # 后台可选择10秒刷新一次或者60秒刷新一次
# 添加课程的时候外键关联该课程的数据直接添加编辑的设置
class LessonInline(object):
model = Lesson
extra = 0
# 添加课程的时候外键关联该课程的数据直接添加编辑的设置
class CourseResourceInline(object):
model = CourseResource
extra = 0
class CourseAdmin(object):
inlines = [LessonInline,CourseResourceInline]
models.py中:
#后台系统根据布尔值BooleanField显示2张表
class BannerCourse(Course):
class Meta:
verbose_name = '轮播课程'
verbose_name_plural = verbose_name
#关键参数,有了这个参数后,不会多一张数据表
proxy = True
xadmin.py中:
class BannerCourseAdmin(object):
inlines = [LessonInline,CourseResourceInline]
# 数据展示
list_display = ['name','desc','detail','degree','learn_times','students']
# 查询
search_fields = ['name','desc','detail','degree','students']
# 筛选(后台管理页面中的过滤器)
list_filter = ['name','desc','detail','degree','learn_times','students']
# 过滤取出的数据
def queryset(self):
qs = super(BannerCourseAdmin, self).queryset() # 这条不起作用
qs.filter(is_banner = True)
return qs
xadmin.site.register(BannerCourse,BannerCourseAdmin)
1.models.py:
#自定义获取章节数
def get_zj_nums(self):
'''
获取课程章节数
'''
all_lessons = self.course.all().count()
return all_lessons
get_zj_nums.short_description = '章节数' # 后台管理显示的title
2.xadmin.py中:
list_display = ['get_zj_nums']
1.models.py中:
# 后台管理获得跳转链接
def go_to(self):
from django.utils.safestring import mark_safe
return mark_safe("<a href='http://www.baidu.com'>跳转</a>")
go_to.short_description = '跳转' # 后台管理显示的title
2.xadmin.py中:
list_display = ['go_to']
# 跟下面一样没有成功
# def save_models(self):
# # 在保存课程的时候统计课程机构的课程数
# obj = self.new_obj
# obj.save()
# if obj.course_org is not None:
# course_org = obj.course_org
# course_org.course_nums = Course.objects.filter(course_org=course_org).count()
# course_org.save()