Django+xadmin打造在线教育平台(十)
目錄
在線教育平臺(一)? ? ??在線教育平臺(二)
在線教育平臺(三)? ? ??在線教育平臺(四)
在線教育平臺(五)? ? ??在線教育平臺(六)
在線教育平臺(七)? ? ??在線教育平臺(八)
在線教育平臺(九)? ? ??在線教育平臺(十)
代碼
github下載
十四、xadmin的進階開發
14.1.權限管理
(1)用戶權限
超級用戶擁有所有權限,其它添加的用戶默認沒有任何權限
進后臺添加一個用戶“Editor1”,勾上“職員狀態”后,這個用戶才可以登錄進后臺,默認沒添加權限的用戶登錄到后臺的情況如下:
接下來,為用戶Editor1添加查看課程和查看章節的權限
?
?再刷新可以看到,有了查看課程和章節的權限了
?
?(2)組的權限
?添加一個組“編輯部門”,賦予如下權限?:
?把剛才的用戶“Editor1”加入到“編輯部門”這個組,然后看用戶現在的權限如下:
?
組里面的成員不但擁有自己本身的權限外,還會擁有組的權限
?
14.2.自定義icon
?xadmin的圖標采用的是第三方css樣式“font awesome”,我們可以進官網下載最新的樣式替代原本的,下載地址:http://www.fontawesome.com.cn/
下載完后把里面的“css”和“fonts”兩個文件夾拷貝到xadmin的源碼(路徑:xadmin/static/vendor/font-awesome)里面
?
使用方法:
以course為例
(1)進官網找到圖標的樣式
(2)course/adminx.py使用
# Course的admin管理器 class CourseAdmin(object):'''課程'''list_display = [ 'name','desc','detail','degree','learn_times','students']search_fields = ['name', 'desc', 'detail', 'degree', 'students']list_filter = [ 'name','desc','detail','degree','learn_times','students']model_icon = 'fa fa-book'再在后臺刷新(ctrl+F5),就可以看到圖標了
?
14.3.默認排序、只讀字段和不顯示的字段
課程:
- 按點擊數倒序排序
- 點擊數不能編輯
- 不顯示收藏人數
?
14.4.inlines添加數據
?目前在添加課程的時候沒法添加章節和課程資源,我們可以用inlines去實現這一功能
class LessonInline(object):model = Lessonextra = 0class CourseResourceInline(object):model = CourseResourceextra = 0#在CourseAdmin中使用inlines添加上面兩個的方法 class CourseAdmin(object):inlines = [LessonInline,CourseResourceInline] #增加章節和課程資源效果如下:
再添加課程的時候,可以直接添加章節和課程資源
?
?
14.5.一張表分兩個Model來管理
課程里面分為輪播課程和不是輪播課程兩種類型,我們可以分開來管理
(1)在course/models.py里面新建一個Model
class BannerCourse(Course):'''顯示輪播課程'''class Meta:verbose_name = '輪播課程'verbose_name_plural = verbose_name#這里必須設置proxy=True,這樣就不會再生成一張表,同時還具有Model的功能proxy = True(2)course/adminx.py
from .models import BannerCourseclass CourseAdmin(object):'''課程'''list_display = [ 'name','desc','detail','degree','learn_times','students'] #顯示的字段search_fields = ['name', 'desc', 'detail', 'degree', 'students'] #搜索list_filter = [ 'name','desc','detail','degree','learn_times','students'] #過濾model_icon = 'fa fa-book' #圖標ordering = ['-click_nums'] #排序readonly_fields = ['click_nums'] #只讀字段exclude = ['fav_nums'] #不顯示的字段inlines = [LessonInline,CourseResourceInline] #增加章節和課程資源def queryset(self):# 重載queryset方法,來過濾出我們想要的數據的qs = super(CourseAdmin, self).queryset()# 只顯示is_banner=True的課程qs = qs.filter(is_banner=False)return qsclass BannerCourseAdmin(object):'''輪播課程'''list_display = [ 'name','desc','detail','degree','learn_times','students']search_fields = ['name', 'desc', 'detail', 'degree', 'students']list_filter = [ 'name','desc','detail','degree','learn_times','students']model_icon = 'fa fa-book'ordering = ['-click_nums']readonly_fields = ['click_nums']exclude = ['fav_nums']inlines = [LessonInline,CourseResourceInline]def queryset(self):#重載queryset方法,來過濾出我們想要的數據的qs = super(BannerCourseAdmin, self).queryset()#只顯示is_banner=True的課程qs = qs.filter(is_banner=True)return qs# 將管理器與model進行注冊關聯 xadmin.site.register(Course, CourseAdmin) xadmin.site.register(BannerCourse, BannerCourseAdmin)?
后臺:可以看到多了一個輪播課程,來達到分類管理的一個功能
?
?
?
14.6.xadmin的其它常見功能
(1)list_editable
在列表頁可以直接編輯的
class CourseAdmin(object):list_editable = ['degree','desc']?
?(2)自定義函數作為列顯示
course/models.py中
class Course(models.Model):' ' ' def get_zj_nums(self):#獲取課程的章節數return self.lesson_set.all().count()get_zj_nums.short_description = '章節數' #在后臺顯示的名稱course/adminx.py中
class CourseAdmin(object):list_display = ['get_zj_nums'] #直接使用函數名作為字段顯示效果:列表字段多了個“章節數”
?
(3)顯示自定義的html代碼
course/models.py中
class Course(models.Model):...def go_to(self):from django.utils.safestring import mark_safe#mark_safe后就不會轉義return mark_safe("<a href='https://home.cnblogs.com/u/derek1184405959/'>跳轉</a>")go_to.short_description = "跳轉"course/adminx.py中
class CourseAdmin(object):list_display = ['go_to']效果:多了一個列表“跳轉”,點擊后跳轉到上面定義的地址
?
(4)refresh定時刷新工具
?course/adminx.py中
class CourseAdmin(object):refresh_times = [3,5] #自動刷新(里面是秒數)后臺效果:
可以選擇3s或者5s自動刷新頁面
?
(5)字段聯動
?應用場景:當添加一門課程的時候,希望課程機構里面的課程數 +1
?重寫xadmin的save_models方法
class CourseAdmin(object):...def save_models(self):# 在保存課程的時候統計課程機構的課程數# obj實際是一個course對象obj = self.new_obj# 如果這里不保存,新增課程,統計的課程數會少一個 obj.save()# 確定課程的課程機構存在。if obj.course_org is not None:#找到添加的課程的課程機構course_org = obj.course_org#課程機構的課程數量等于添加課程后的數量course_org.course_nums = Course.objects.filter(course_org=course_org).count()course_org.save() # course/adminx.pyimport xadminfrom .models import Course, Lesson, Video, CourseResource,BannerCourse from organization.models import CourseOrgclass LessonInline(object):model = Lessonextra = 0class CourseResourceInline(object):model = CourseResourceextra = 0# Course的admin管理器 class CourseAdmin(object):'''課程'''list_display = [ 'name','desc','detail','degree','learn_times','students','get_zj_nums','go_to'] #顯示的字段search_fields = ['name', 'desc', 'detail', 'degree', 'students'] #搜索list_filter = [ 'name','desc','detail','degree','learn_times','students'] #過濾model_icon = 'fa fa-book' #圖標ordering = ['-click_nums'] #排序readonly_fields = ['click_nums'] #只讀字段exclude = ['fav_nums'] #不顯示的字段list_editable = ['degree','desc']# refresh_times = [3,5] #自動刷新(里面是秒數范圍)inlines = [LessonInline,CourseResourceInline] #增加章節和課程資源def queryset(self):# 重載queryset方法,來過濾出我們想要的數據的qs = super(CourseAdmin, self).queryset()# 只顯示is_banner=True的課程qs = qs.filter(is_banner=False)return qsdef save_models(self):# 在保存課程的時候統計課程機構的課程數# obj實際是一個course對象obj = self.new_obj# 如果這里不保存,新增課程,統計的課程數會少一個 obj.save()# 確定課程的課程機構存在。if obj.course_org is not None:#找到添加的課程的課程機構course_org = obj.course_org#課程機構的課程數量等于添加課程后的數量course_org.course_nums = Course.objects.filter(course_org=course_org).count()course_org.save()class BannerCourseAdmin(object):'''輪播課程'''list_display = [ 'name','desc','detail','degree','learn_times','students']search_fields = ['name', 'desc', 'detail', 'degree', 'students']list_filter = [ 'name','desc','detail','degree','learn_times','students']model_icon = 'fa fa-book'ordering = ['-click_nums']readonly_fields = ['click_nums']exclude = ['fav_nums']inlines = [LessonInline,CourseResourceInline]def queryset(self):#重載queryset方法,來過濾出我們想要的數據的qs = super(BannerCourseAdmin, self).queryset()#只顯示is_banner=True的課程qs = qs.filter(is_banner=True)return qsclass LessonAdmin(object):'''章節'''list_display = ['course', 'name', 'add_time']search_fields = ['course', 'name']#這里course__name是根據課程名稱過濾list_filter = ['course__name', 'name', 'add_time']class VideoAdmin(object):'''視頻'''list_display = ['lesson', 'name', 'add_time']search_fields = ['lesson', 'name']list_filter = ['lesson', 'name', 'add_time']class CourseResourceAdmin(object):'''課程資源'''list_display = ['course', 'name', 'download', 'add_time']search_fields = ['course', 'name', 'download']list_filter = ['course__name', 'name', 'download', 'add_time']# 將管理器與model進行注冊關聯 xadmin.site.register(Course, CourseAdmin) xadmin.site.register(BannerCourse, BannerCourseAdmin) xadmin.site.register(Lesson, LessonAdmin) xadmin.site.register(Video, VideoAdmin) xadmin.site.register(CourseResource, CourseResourceAdmin) course/adminx.py全部代碼?
14.7.增加富文本編輯器Ueditor
(1)下載
地址:https://github.com/twz915/DjangoUeditor3/
解壓后,把DjangoUeditor文件夾拷貝到項目目錄下面
注意:直接pip install DjangoUeditor的方法會出問題
(2)settings中添加app
INSTALLED_APPS = ['DjangoUeditor', ](3)MxOnline/urls.py
# 富文本編輯器urlpath('ueditor/',include('DjangoUeditor.urls' )),?(4)course/models.py中Course修改detail字段
class Course(models.Model):# detail = models.TextField("課程詳情")detail = UEditorField(verbose_name=u'課程詳情', width=600, height=300, imagePath="courses/ueditor/",filePath="courses/ueditor/", default='')(5)xadmin/plugs目錄下新建ueditor.py文件,代碼如下
import xadmin from xadmin.views import BaseAdminPlugin, CreateAdminView, ModelFormAdminView, UpdateAdminView from DjangoUeditor.models import UEditorField from DjangoUeditor.widgets import UEditorWidget from django.conf import settingsclass XadminUEditorWidget(UEditorWidget):def __init__(self, **kwargs):self.ueditor_options = kwargsself.Media.js = Nonesuper(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().widgetparam = {}param.update(widget.ueditor_settings)param.update(widget.attrs)return {'widget':XadminUEditorWidget(**param)}return attrsdef 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)(6)xadmin/plugs/__init__.py里面添加ueditor插件
PLUGINS = ('ueditor', )(7)course/adminx.py中使用
class CourseAdmin(object):#detail就是要顯示為富文本的字段名style_fields = {"detail": "ueditor"}(8)course-detail.html
在模板中必須關閉Django的自動轉義才能正常顯示
<div class="tab_cont tab_cont1">{% autoescape off %}{{ course.detail }}{% endautoescape %}</div>最終效果:
后臺編輯頁面
?
?前端顯示
?
?
?
?
總結
以上是生活随笔為你收集整理的Django+xadmin打造在线教育平台(十)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 读书笔记----javascript函数
- 下一篇: keepalived中的脑裂