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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM