Fork me on GitHub

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

posted @ 2018-03-05 22:54  派对动物  阅读(4527)  评论(0)    收藏  举报
Top