Django_xAdmin項目(三)之xAdmin進階開發

替換django xadmin自帶的users模塊:

1.xadmin-->plugins-->auth.py: 

# 加載替換系統user的方法
from django.contrib.auth import get_user_model
# 替換user模塊
User = get_user_model()

2.settings.py:

# 重載user
AUTH_USER_MODEL = 'users.UserProfile'

 

xadmin-->plugins-->auth.py:  用戶詳情頁佈局方法 get_form_layout 可修改該方法下的代碼調整佈局

# 用戶信息詳情頁面佈局
class UserAdmin(object):
    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設置成一行
                             Row('first_name', 'last_name'),
                             'email'
                             ),
                    Fieldset(_('Permissions'),
                             'groups', 'user_permissions'
                             ),
                    Fieldset(_('Important dates'),
                             'last_login', 'date_joined'
                             ),
                ),
                # Side右側
                Side(
                    Fieldset(_('Status'),
                             'is_active', 'is_staff', 'is_superuser',
                             ),
                )
            )
        return super(UserAdmin, self).get_form_layout()

 

用戶權限配置

1.用戶信息詳情頁可配置用戶的對數據表的增刪改查權限,也可以添加到組中具備對應組中的權限

2.可通過建立組,在組下配置一些權限,將用戶添加到這個組中就具備了這個組的這些權限

 

左側菜單圖標設置:

1.下載fontawesome http://www.fontawesome.com.cn/

2.將下載目錄下的css和fonts文件夾 替換xadmin/static/vendor/font-awesome/ 下的css和fonts

3. 在adminx.py 下的 admin類 設置model_icon       fa fa-envelope-o爲http://www.fontawesome.com.cn/ 中的圖標class

# 郵箱驗證菜單圖標 model_icon
class EmailVerifyRecordAdmin(object):
    model_icon = 'fa fa-envelope-o'

設置完之後ctrl+F5 強制刷新頁面

 

列表排序、只讀字段和字段的隱藏

在adminx.py 下的 admin類 設置

class EmailVerifyRecordAdmin(object):
    # 按id進行排序
    ordering = ['id']
    # 設置只讀的字段
    readonly_fields = ['code']
    # 設置字段不顯示
    exclude = ['send_time']

 

加載外鍵時 在外鍵的admin類設置relfield_style = 'fk-ajax' 下拉可以不一次性全部加載,避免數據過大加載過慢  可以通過搜索 ajxa的方式加載

 

課程下本來不可以添加章節和課程資源的,可以在class CourseAdmin 中 設置inlines屬性設置

# 課程inline
class LessonInline(object):
    model = Lesson
    extra = 0


# 課程資源inline
class CourseResourceInline(object):
    model = CourseResource
    extra = 0

# 註冊xadmin課程
class CourseAdmin(object):
    # 通過inline可以在課程下添加章節和課程資源的,本來是不可以的
    inlines = [LessonInline, CourseResourceInline]

 

自定義列表返回數據,同一個model註冊兩個管理器

course/model.py

# 課程信息表
class Course(models.Model):
    name = models.CharField(max_length=50, verbose_name=u"課程名")
    desc = models.CharField(max_length=300, verbose_name=u"課程描述")
    # 課程詳情 富文本 不限長度 使用TextField()
    detail = models.TextField(verbose_name=u"課程詳情")
    degree = models.CharField(verbose_name=u"學習難度", choices=(("cj", "初級"), ("zj", "中級"), ("gj", "高級")), max_length=2)
    is_banner = models.BooleanField(verbose_name=u"是否輪播", default=False)
    # 學習時長
    learn_times = models.IntegerField(default=0, verbose_name=u"學習時長(分鐘)")
    students = models.IntegerField(default=0, verbose_name=u"學習人數")
    fav_nums = models.IntegerField(default=0, verbose_name=u"收藏人數")
    image = models.ImageField(upload_to='courses/%Y/%m', verbose_name=u"封面圖", max_length=100)
    click_nums = models.IntegerField(default=0, verbose_name=u"點擊數")
    add_time = models.DateTimeField(default=datetime.now, verbose_name=u"添加時間")

    class Meta:
        verbose_name = u"課程"
        verbose_name_plural = verbose_name

# 輪播課程
class BannerCourse(Course):
    class Meta:
        verbose_name = u"輪播課程"
        verbose_name_plural = verbose_name
        # 設置 proxy = True 不會再生成一張新的數據表
        proxy = True

course/adminx.py:  課程和輪播課程共用同一個數據表(課程數據表)通過queryset方法可以劃分成兩類數據

class CourseAdmin(object):
    # 設置queryset返回我們需要的對象列表 而不是所有的對象列表
    def queryset(self):
        # 調用父類的方法
        qs = super(CourseAdmin, self).queryset()
        # 是否輪播
        qs = qs.filter(is_banner=False)
        return qs

# 註冊輪播課程
class BannerCourseAdmin(object):
    # 設置queryset返回我們需要的對象列表 而不是所有的對象列表
    def queryset(self):
        # 調用父類的方法
        qs = super(BannerCourseAdmin, self).queryset()
        print(qs)
        # 是否輪播
        qs = qs.filter(is_banner=True)
        return qs

 

xadmin的其他功能:

1.list_editable 設置列表中的字段可編輯
list_editable = ['degree', 'desc']

 2. list_display中可以顯示model.py 中class 中方法 

 model.py:

class Course(models.Model):
    # 獲取章節數
    def get_lesson_num(self):
        return 3
    # get_lesson_num.short_description 設置顯示的名稱 否則會直接顯示方法名稱
    get_lesson_num.short_description = '章節數'

    # 轉化html標籤
    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 = "跳轉"

adminx.py:

class CourseAdmin(object):
    list_display = ['get_lesson_num', 'go_to']

3.自動刷新列表:courseAdmin中 設置 refresh_times = [3,5]  可選值爲3秒刷新、5秒刷新

4.保存數據的時候可以通過def save_models(self)做一些其他邏輯

如:保存課程的時候統計課程機構下的課程數 models.py

 # 保存課程的時候可以統計課程機構下的課程數
    def save_models(self):
        obj = self.new_obj
        # 保存課程
        obj.save()
        if obj.course_org is not None:
            # 外鍵
            course_org = obj.course_org
            # 修改機構下的課程數
            couser_org.course_num = Course.objects.filter(course_org=course_org).count()
            couser_org.save()

 

xadmin集成富文本ueditor插件

1. 安裝djangoueditor: https://github.com/twz915/DjangoUeditor3 下載 解壓

2.進入解壓目錄 執行cmd --> workon dj_education(進入虛擬環境)-->python setup.py install(安裝)

使用方法:https://github.com/twz915/DjangoUeditor3 中的使用說明

3.  settings.py: 安裝app

  INSTALLED_APPS = ('DjangoUeditor', ) 

4.urls.py: 配置urls

# 富文本url
path('ueditor/', include('DjangoUeditor.urls'))

5 使用

# 引入UEditorField
from DjangoUeditor.models import UEditorField

# 課程詳情 富文本 不限長度 使用TextField()
detail = UEditorField(verbose_name=u'課程詳情', width=600, 
height=300, imagePath="course/ueditor/", filePath="course/ueditor/", 
default="")

 6 配置ueditor插件

ueditor.py編寫如下:

# -*- coding: utf-8 -*-

__author__ = 'westbrook-ding'

import xadmin
from xadmin.views import BaseAdminPlugin, CreateAdminView, ModelFormAdminView, UpdateAdminView
from DjangoUeditor.models import UEditorField
from DjangoUeditor.widgets import UEditorWidget
from django.conf import settings


class XadminUEditorWidget(UEditorWidget):
    def __init__(self,**kwargs):
        self.ueditor_options=kwargs
        self.Media.js = None
        super(XadminUEditorWidget,self).__init__(kwargs)

class UeditorPlugin(BaseAdminPlugin):

    def get_field_style(self, attrs, db_field, style, **kwargs):
        if style == 'ueditor':
            if isinstance(db_field, UEditorField):
                widget = db_field.formfield().widget
                param = {}
                param.update(widget.ueditor_settings)
                param.update(widget.attrs)
                return {'widget': XadminUEditorWidget(**param)}
        return attrs

    def block_extrahead(self, context, nodes):
        js = '<script type="text/javascript" src="%s"></script>' % (settings.STATIC_URL + "ueditor/ueditor.config.js")         #自己的靜態目錄
        js += '<script type="text/javascript" src="%s"></script>' % (settings.STATIC_URL + "ueditor/ueditor.all.min.js")   #自己的靜態目錄
        nodes.append(js)

xadmin.site.register_plugin(UeditorPlugin, UpdateAdminView)
xadmin.site.register_plugin(UeditorPlugin, CreateAdminView)

這時重新運行項目會報錯,解決方式https://blog.csdn.net/jingyu333/article/details/82287018  註釋一行代碼

前端富文本顯示轉義問題解決如下:

{% autoescape off %}

     {{course.detail}}

{% endautoescape %}

 

excel導入插件介紹

1.xadmin/plugins/excel.py:

import xadmin
from xadmin.views import BaseAdminPlugin, ListAdminView
from django.template import loader


# excel 導入
class ListImportExcelPlugin(BaseAdminPlugin):
    import_excel = False

    def init_request(self, *args, **kwargs):
        return bool(self.import_excel)

    def block_top_toolbar(self, context, nodes):
        print(context)
        nodes.append(loader.render_to_string('xadmin/excel/model_list.top_toolbar.import.html'))


xadmin.site.register_plugin(ListImportExcelPlugin, ListAdminView)

2.xadmin/plugins/init.py 註冊excel

3. admix.py

# 使用excel導入功能
import_excel = True

# 並重寫post函數
def post(self, request, *args, **kwargs):
    if "excel" in request.FILES
    # 此處自定義邏輯,如讀取文件保存數據庫等
        pass
        return super(CourseAdmin, self).post(request, args, kwargs)

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章