Django+xadmin打造在线教育平台(十)
目錄
在線教育平臺(tái)(一)? ? ??在線教育平臺(tái)(二)
在線教育平臺(tái)(三)? ? ??在線教育平臺(tái)(四)
在線教育平臺(tái)(五)? ? ??在線教育平臺(tái)(六)
在線教育平臺(tái)(七)? ? ??在線教育平臺(tái)(八)
在線教育平臺(tái)(九)? ? ??在線教育平臺(tái)(十)
代碼
github下載
十四、xadmin的進(jìn)階開發(fā)
14.1.權(quán)限管理
(1)用戶權(quán)限
超級(jí)用戶擁有所有權(quán)限,其它添加的用戶默認(rèn)沒(méi)有任何權(quán)限
進(jìn)后臺(tái)添加一個(gè)用戶“Editor1”,勾上“職員狀態(tài)”后,這個(gè)用戶才可以登錄進(jìn)后臺(tái),默認(rèn)沒(méi)添加權(quán)限的用戶登錄到后臺(tái)的情況如下:
接下來(lái),為用戶Editor1添加查看課程和查看章節(jié)的權(quán)限
?
?再刷新可以看到,有了查看課程和章節(jié)的權(quán)限了
?
?(2)組的權(quán)限
?添加一個(gè)組“編輯部門”,賦予如下權(quán)限?:
?把剛才的用戶“Editor1”加入到“編輯部門”這個(gè)組,然后看用戶現(xiàn)在的權(quán)限如下:
?
組里面的成員不但擁有自己本身的權(quán)限外,還會(huì)擁有組的權(quán)限
?
14.2.自定義icon
?xadmin的圖標(biāo)采用的是第三方css樣式“font awesome”,我們可以進(jìn)官網(wǎng)下載最新的樣式替代原本的,下載地址:http://www.fontawesome.com.cn/
下載完后把里面的“css”和“fonts”兩個(gè)文件夾拷貝到xadmin的源碼(路徑:xadmin/static/vendor/font-awesome)里面
?
使用方法:
以course為例
(1)進(jìn)官網(wǎng)找到圖標(biāo)的樣式
(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'再在后臺(tái)刷新(ctrl+F5),就可以看到圖標(biāo)了
?
14.3.默認(rèn)排序、只讀字段和不顯示的字段
課程:
- 按點(diǎn)擊數(shù)倒序排序
- 點(diǎn)擊數(shù)不能編輯
- 不顯示收藏人數(shù)
?
14.4.inlines添加數(shù)據(jù)
?目前在添加課程的時(shí)候沒(méi)法添加章節(jié)和課程資源,我們可以用inlines去實(shí)現(xiàn)這一功能
class LessonInline(object):model = Lessonextra = 0class CourseResourceInline(object):model = CourseResourceextra = 0#在CourseAdmin中使用inlines添加上面兩個(gè)的方法 class CourseAdmin(object):inlines = [LessonInline,CourseResourceInline] #增加章節(jié)和課程資源效果如下:
再添加課程的時(shí)候,可以直接添加章節(jié)和課程資源
?
?
14.5.一張表分兩個(gè)Model來(lái)管理
課程里面分為輪播課程和不是輪播課程兩種類型,我們可以分開來(lái)管理
(1)在course/models.py里面新建一個(gè)Model
class BannerCourse(Course):'''顯示輪播課程'''class Meta:verbose_name = '輪播課程'verbose_name_plural = verbose_name#這里必須設(shè)置proxy=True,這樣就不會(huì)再生成一張表,同時(shí)還具有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'] #過(guò)濾model_icon = 'fa fa-book' #圖標(biāo)ordering = ['-click_nums'] #排序readonly_fields = ['click_nums'] #只讀字段exclude = ['fav_nums'] #不顯示的字段inlines = [LessonInline,CourseResourceInline] #增加章節(jié)和課程資源def queryset(self):# 重載queryset方法,來(lái)過(guò)濾出我們想要的數(shù)據(jù)的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方法,來(lái)過(guò)濾出我們想要的數(shù)據(jù)的qs = super(BannerCourseAdmin, self).queryset()#只顯示is_banner=True的課程qs = qs.filter(is_banner=True)return qs# 將管理器與model進(jìn)行注冊(cè)關(guān)聯(lián) xadmin.site.register(Course, CourseAdmin) xadmin.site.register(BannerCourse, BannerCourseAdmin)?
后臺(tái):可以看到多了一個(gè)輪播課程,來(lái)達(dá)到分類管理的一個(gè)功能
?
?
?
14.6.xadmin的其它常見功能
(1)list_editable
在列表頁(yè)可以直接編輯的
class CourseAdmin(object):list_editable = ['degree','desc']?
?(2)自定義函數(shù)作為列顯示
course/models.py中
class Course(models.Model):' ' ' def get_zj_nums(self):#獲取課程的章節(jié)數(shù)return self.lesson_set.all().count()get_zj_nums.short_description = '章節(jié)數(shù)' #在后臺(tái)顯示的名稱course/adminx.py中
class CourseAdmin(object):list_display = ['get_zj_nums'] #直接使用函數(shù)名作為字段顯示效果:列表字段多了個(gè)“章節(jié)數(shù)”
?
(3)顯示自定義的html代碼
course/models.py中
class Course(models.Model):...def go_to(self):from django.utils.safestring import mark_safe#mark_safe后就不會(huì)轉(zhuǎn)義return mark_safe("<a href='https://home.cnblogs.com/u/derek1184405959/'>跳轉(zhuǎn)</a>")go_to.short_description = "跳轉(zhuǎn)"course/adminx.py中
class CourseAdmin(object):list_display = ['go_to']效果:多了一個(gè)列表“跳轉(zhuǎn)”,點(diǎn)擊后跳轉(zhuǎn)到上面定義的地址
?
(4)refresh定時(shí)刷新工具
?course/adminx.py中
class CourseAdmin(object):refresh_times = [3,5] #自動(dòng)刷新(里面是秒數(shù))后臺(tái)效果:
可以選擇3s或者5s自動(dòng)刷新頁(yè)面
?
(5)字段聯(lián)動(dòng)
?應(yīng)用場(chǎng)景:當(dāng)添加一門課程的時(shí)候,希望課程機(jī)構(gòu)里面的課程數(shù) +1
?重寫xadmin的save_models方法
class CourseAdmin(object):...def save_models(self):# 在保存課程的時(shí)候統(tǒng)計(jì)課程機(jī)構(gòu)的課程數(shù)# obj實(shí)際是一個(gè)course對(duì)象obj = self.new_obj# 如果這里不保存,新增課程,統(tǒng)計(jì)的課程數(shù)會(huì)少一個(gè) obj.save()# 確定課程的課程機(jī)構(gòu)存在。if obj.course_org is not None:#找到添加的課程的課程機(jī)構(gòu)course_org = obj.course_org#課程機(jī)構(gòu)的課程數(shù)量等于添加課程后的數(shù)量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'] #過(guò)濾model_icon = 'fa fa-book' #圖標(biāo)ordering = ['-click_nums'] #排序readonly_fields = ['click_nums'] #只讀字段exclude = ['fav_nums'] #不顯示的字段list_editable = ['degree','desc']# refresh_times = [3,5] #自動(dòng)刷新(里面是秒數(shù)范圍)inlines = [LessonInline,CourseResourceInline] #增加章節(jié)和課程資源def queryset(self):# 重載queryset方法,來(lái)過(guò)濾出我們想要的數(shù)據(jù)的qs = super(CourseAdmin, self).queryset()# 只顯示is_banner=True的課程qs = qs.filter(is_banner=False)return qsdef save_models(self):# 在保存課程的時(shí)候統(tǒng)計(jì)課程機(jī)構(gòu)的課程數(shù)# obj實(shí)際是一個(gè)course對(duì)象obj = self.new_obj# 如果這里不保存,新增課程,統(tǒng)計(jì)的課程數(shù)會(huì)少一個(gè) obj.save()# 確定課程的課程機(jī)構(gòu)存在。if obj.course_org is not None:#找到添加的課程的課程機(jī)構(gòu)course_org = obj.course_org#課程機(jī)構(gòu)的課程數(shù)量等于添加課程后的數(shù)量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方法,來(lái)過(guò)濾出我們想要的數(shù)據(jù)的qs = super(BannerCourseAdmin, self).queryset()#只顯示is_banner=True的課程qs = qs.filter(is_banner=True)return qsclass LessonAdmin(object):'''章節(jié)'''list_display = ['course', 'name', 'add_time']search_fields = ['course', 'name']#這里course__name是根據(jù)課程名稱過(guò)濾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進(jìn)行注冊(cè)關(guān)聯(lián) 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文件夾拷貝到項(xiàng)目目錄下面
注意:直接pip install DjangoUeditor的方法會(huì)出問(wèn)題
(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
在模板中必須關(guān)閉Django的自動(dòng)轉(zhuǎn)義才能正常顯示
<div class="tab_cont tab_cont1">{% autoescape off %}{{ course.detail }}{% endautoescape %}</div>最終效果:
后臺(tái)編輯頁(yè)面
?
?前端顯示
?
?
?
?
總結(jié)
以上是生活随笔為你收集整理的Django+xadmin打造在线教育平台(十)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 读书笔记----javascript函数
- 下一篇: keepalived中的脑裂