xadmin的使用
xadmin的使用及注意点
1 基本使用
注意 xadmin <=1.9 版本 django <= 1.9 功能正常
注意django<1.9 旧版本 中间件配置是 middleware_class
xadmin 1.11 django 1.11 不能使用小插件
1 下载与安装
pip 编码问题
解决方法--DJANGO 1.9 安装 XADMIN 遇到的问题
本地 zip 方法安装 (注意,依赖包的下载)
2 部署
! installed apps 中 添加
'xadmin',
'crispy_forms'
! urls 中 配置
import xadmin
urlpatterns = [
url(r'^xadmin/',xadmin.site.urls),
]
! 同步数据表
makekigrations
migrate -->> 生成下面的四张表(失败需要全部清空 migrations记录)
xadmin_bookmark
xadmin_log
xadmin_usersettings
xadmin_userwidget
否则会有异常
3 注册使用
新建 adminx.py 注册文件
注意 : user 表 默认注册 == 不需要再注册
外键关联的 可以 用 双下划綫 _ _ 如 'book__name'来显示 筛选
class CourseAdmin(object):
list_display = [,]
list_filter = [,]
search_fields = [,]
list_editable = [,]
ordering = ['-clicknums']
readonly_fields = [,] 只读字段
exclude = [,]
class CourseOrgAdmin(object): # 课程的外键关联 显示的不是全部的下拉框,而是搜索框
relfield_style = 'fk_ajax' # fk-外键 显示样式
在 wizard 中 可能会报错
except:
# work for django<1.8
from django.contrib.formtools.wizard.storage import get_storage
from django.contrib.formtools.wizard.forms import ManagementForm
from django.contrib.formtools.wizard.views import StepsHelper
改为 except:
pass
xadmin 全局的样式配置
主题配置
在 adminx 注册文件中 增加
from xadmin import views
class BaseSetting(object):
enable_themes = True # 使用主题
use_bootswatch = True
xadmin.site.register(views.BaseAdminView,BaseSetting)
其他全局样式配置
class GlobalSettings(object):
site_title = '慕学管理系统' # 标题
site_footer = '慕学在线网' # 页尾
menu_style = 'accordion' # 设置左侧菜单 折叠样式
xadmin.site.register(views.CommAdminView,GlobalSettings)
app 的显示名字
每个 app 应用下的 apps.py文件
verbose_name = 'apps的名字'
__init__.py文件
default_app_config = 'crm.apps.CRMConfig'
2 扩展
4 inlines 机制 同一个页面 可以添加 所有的相关信息
注意: 只有一层嵌套
class LessonInline(object):
model = Lesson
extra = 0
class CourseAdmin(object):
list_display = []
search_field = []
...
inlines = [LessonInline]
5 重载显示样式
from xadmin.layout import Main,Fieldset,Row,Side
def get_form_layout(self):
if self.org_obj:
self.form_layout = (
Main(
Fieldset('',
'username', 'password',
css_class='unsort no_title'
),
Fieldset(_('Personal info'),
Row('first_name', 'last_name'), # 显示在一行
'email'
),
Fieldset(_('Permissions'),
'groups', 'user_permissions'
),
Fieldset(_('Important dates'),
'last_login', 'date_joined'
),
),
Side(
Fieldset(_('Status'),
'is_active', 'is_staff', 'is_superuser',
),
)
)
return super(UserAdmin, self).get_form_layout()子主题
6 model 的 管理器,一个model 分不同情况 管理
class Course(models.Model):
pass
class BannerCourse(Course): # 继承 父类 course
class Meta:
verbose_name = '轮播课程'
verbose_name_plural = verbose_name
proxy = True # 不会生成新的表
注册新的表
class CourseSourceAdmin(object):
list_display = ['course','name','add_time','download']
list_filter = ['course','name','add_time','download']
search_fields = ['course','name','download']
def queryset(self):
qs = super(CourseAdmin,self).queryset()
qs = qs.filter(is_banner=False)
return qs
7 重载 save_models 方法
后台管理过程中 数据的系列改变
course 新增对象
courseorg 中的对应数值 也 相应的 变化
class CourseAdmin():
def save_models(self):
course_obj = self.new_obj
course_obj.save()
course_org = course_obj.course_org
if course_org:
course_org.courses_nums = Course.objects.all().count()
course_org.save()
8 xadmin的 refresh 插件
refresh_times = [3,5] # 选择刷新时间 3,5 秒
9 xadmin 注册时候定义函数,这些函数也可以写在 model中
from django.utils.safestring import mark_safe
class CourseAdmin():
list_display = ['','rename'] # 之前在model中定义的函数
1
def rename(self,obj):
return '{0} ({1}期)'.format(obj.course,obj.semster)
2 actions
def get_nums(self, request, queryset):
return self.queryset().count()
get_nums.short_description = '获取数据'
actions = [get_nums, ]
例子1: 获取 学生的人数
def rename(self,obj):
return '{0} ({1}期)'.format(obj.course,obj.semster)
def student_num(self,obj):
return obj.student_set.all().count()
例子2 批量初始化上课记录
def init_course_record(self, request, queryset):
teacher_ids = [obj.id for obj in queryset]
bulk_list = []
class_lists = ClassList.objects.filter(teacher__id__in=teacher_ids)
for class_ in class_lists:
for teacher in queryset:
bulk_list.append(CourseRecord(class_obj=class_, teacher=teacher))
CourseRecord.objects.bulk_create(bulk_list)
init_course_record.short_description = '初始化上课记录'
actions = [init_course_record, ]
例子3 考勤批量处理
def check_attendance(self,request,queryset):
queryset.update(record='noshow')
def check_vacate(self,request,queryset):
queryset.update(record='vacate')
def check_late(self,request,queryset):
queryset.update(record='late')
check_attendance.short_description = '缺勤批量处理'
check_vacate.short_description = '请假批量处理'
check_late.short_description = '迟到批量处理'
actions = [check_attendance,check_vacate,check_late]
10 显示的 小图标icon
xadmin/vendor/font-awesome
用最新版替换--图标存放文件
model_icon 字段 = 'fa fa-icon'
指定 font-awesome 图标
class CourseAdmin(object):
list_display = ['name']
list_filter = ['name']
search_fields = ['name']
model_icon = 'fa fa-leanpub' # #
11 获取当前的user表model
from django.contrib.auth import get_user_model (获取当前的user表model)
User = get_user_model()
site.register(User,Useradmin)
12 卸载注册的model
from django.contrib.auth.models import User
xadmin.site.unregister(User)
13 替换默认的注册 user(继承了abstractuser)
class UserInfoAdmin(object):
list_display = ['auth','name','depart','email','username']
list_filter = ['auth','name','depart','email','username']
search_fields = ['auth','name','depart','email','username']
list_editable = ['auth','name','depart','email','username']
list_display_links = ['auth','name','depart','email','username']
model_icon = 'fa fa-user-circle-o'
from django.contrib.auth import get_user_model # 获取当前的user_model
xadmin.site.unregister(get_user_model()) # 注销 user
xadmin.site.register(UserInfo,UserInfoAdmin) # 注册新的 user
读书使人心眼明亮