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
原文地址:https://www.cnblogs.com/big-handsome-guy/p/8511858.html