xadmin的進階開發(fā)
標(biāo)簽: django
userprofile 注冊以及django的權(quán)限管理
- 用戶信息放入用戶欄中(針對老版本的bug)
通過將userprofile繼承與xadmin中plugin下面的UserAdmin ,并注冊userprofile,同時注銷User矾兜。
# _*_ encoding:utf-8 _*_
__author__ = 'wrj008'
__date__ = '2018/3/9 17:15'
import xadmin
from xadmin import views
from xadmin.plugins.auth import UserAdmin, User
from .models import EmailVerifyRecord, Banner
from users.models import UserProfile
class UserProfileAdmin(UserAdmin):
pass
class BaseSetting(object):
enable_themes = True
use_bootswatch = True
class GloableSetting(object):
site_title = '教育后臺管理系統(tǒng)'
site_footer = 'xiaojinzi'
menu_style = 'accordion'
class EmailVerifyRecordAdmin(object):
list_display = ['code', 'email', 'send_time', 'send_type']
search_fields = ['code', 'email', 'send_time']
list_filter = ['code', 'email', 'send_time', 'send_type']
class BannerAdmin(object):
list_display = ['title', 'image', 'url', 'index', 'add_time']
search_fields = ['title', 'image', 'url', 'index']
list_filter = ['title', 'image', 'url', 'index', 'add_time']
xadmin.site.unregister(User)
xadmin.site.register(EmailVerifyRecord, EmailVerifyRecordAdmin)
xadmin.site.register(Banner, BannerAdmin)
xadmin.site.register(UserProfile, UserProfileAdmin)
xadmin.site.register(views.BaseAdminView, BaseSetting)
xadmin.site.register(views.CommAdminView, GloableSetting)
- 另一種方式是通過在xadmin.auth中添加
from django.contrib.auth import get_user_model
User = get_user_model()
- 用戶的權(quán)限管理
通過對軟件進行操作损趋。
用戶后臺界面中的icon圖片進行修改
django用的是font-awesome樣式風(fēng)格。 地址
在修改的adminx的下面添加
model_icon = 'fa fa-circle-o-notch fa-spin'
排序
ordering = ['-click_nums']
只讀字段顯示
readonly_fields = ['click_nums']
不顯示字段(與上面會存在沖突)
exclude = ['']
下拉選擇過多時椅寺,通過外鍵的主表添加字段浑槽,異步搜索呈現(xiàn)內(nèi)容
relfield_style = 'fk-ajax'
列表中字段直接修改
list_editable = ['']
自定義列表返回數(shù)據(jù),同一model兩個注冊管理器
- inline操作
添加課程的同時在課程截界面添加章節(jié)信息返帕。
class LessonAinline(object):
model = Lesson
extra = 0
class CourseAdmin(object):
list_display = ['name', 'desc', 'detail', 'degree', 'learn_time', 'students', 'fav_nums', 'click_nums', 'image',
'add_time']
search_fields = ['name', 'desc', 'detail', 'degree', 'learn_time', 'students', 'fav_nums', 'click_nums', 'image']
list_filter = ['name', 'desc', 'detail', 'degree', 'learn_time', 'students', 'fav_nums', 'click_nums', 'image',
'add_time']
inlines = [LessonAinline]
- 同一model兩個注冊管理器
例如其中的輪播課程桐玻,可以分為兩個列表頁,其中一個是輪播課程界面荆萤,另一個是非輪播界面镊靴。
class BannerCourse(Course):
"""
輪播圖課程
"""
class Meta:
verbose_name = u'輪播圖課程'
verbose_name_plural = verbose_name
proxy = True
# _*_ encoding:utf-8 _*_
from __future__ import unicode_literals
from datetime import datetime
from django.db import models
from organization.models import CourseOrg, Teacher
# Create your models here.
class Course(models.Model):
course_org = models.ForeignKey(CourseOrg, verbose_name=u'課程機構(gòu)')
name = models.CharField(max_length=128, verbose_name=u'課程名稱')
desc = models.CharField(max_length=256, verbose_name=u'課程描述')
category = models.CharField(default=u'后端開發(fā)', max_length=20, verbose_name=u'課程分類')
detail = models.TextField(verbose_name=u'課程詳情')
degree = models.CharField(choices=(('cj', '初級'), ('zj', '中級'), ('gj', '高級')), max_length=2, verbose_name=u'課程難度')
learn_time = models.IntegerField(default=0, verbose_name=u'課程時長')
students = models.IntegerField(default=0, verbose_name=u'學(xué)習(xí)人數(shù)')
fav_nums = models.IntegerField(default=0, verbose_name=u'收藏人數(shù)')
click_nums = models.IntegerField(default=0, verbose_name=u'點擊數(shù)')
teacher = models.ForeignKey(Teacher, null=True, blank=True, verbose_name=u'教師外鍵')
image = models.ImageField(upload_to='courses/%Y/%m', verbose_name=u'封面圖', max_length=128)
tag = models.CharField(default='', max_length=20, verbose_name=u'課程標(biāo)簽')
youneed_know = models.CharField(default='', max_length=256, verbose_name=u'課程須知')
is_banner = models.BooleanField(default=False, verbose_name=u'是否是廣告欄')
teacher_tell = models.CharField(default='', max_length=256, verbose_name=u'教師建議')
add_time = models.DateTimeField(default=datetime.now, verbose_name=u'添加時間')
class Meta:
verbose_name = u'課程信息'
verbose_name_plural = verbose_name
def get_lesson_count(self):
# 課程章節(jié)外鍵獲取總數(shù)
return self.lesson_set.all().count()
def get_students_list(self):
# 根據(jù)用戶操作外鍵獲取學(xué)習(xí)用戶
return self.usercourse_set.all()[:5]
def ger_lesson_detail(self):
# 獲取所有的章節(jié)信息
return self.lesson_set.all()
def __unicode__(self):
return self.name
class BannerCourse(Course):
"""
輪播圖課程
"""
class Meta:
verbose_name = u'輪播圖課程'
verbose_name_plural = verbose_name
proxy = True
class Lesson(models.Model):
course = models.ForeignKey(Course, verbose_name=u'章節(jié)外鍵')
name = models.CharField(max_length=128, verbose_name=u'章節(jié)名稱')
add_time = models.DateTimeField(default=datetime.now, verbose_name=u'添加時間')
class Meta:
verbose_name = u'章節(jié)信息'
verbose_name_plural = verbose_name
def __unicode__(self):
return self.name
def get_video_info(self):
# 獲取所有視屏信息
return self.video_set.all()
class Video(models.Model):
lesson = models.ForeignKey(Lesson, verbose_name=u'視頻')
name = models.CharField(max_length=128, verbose_name=u'視頻名稱')
url = models.CharField(default='', max_length=200, verbose_name=u'章節(jié)連接')
learn_time = models.IntegerField(default=0, verbose_name=u'章節(jié)時長')
add_time = models.DateTimeField(default=datetime.now, verbose_name=u'添加時間')
class Meta:
verbose_name = u'視頻信息'
verbose_name_plural = verbose_name
def __unicode__(self):
return self.name
class CourseResource(models.Model):
course = models.ForeignKey(Course, verbose_name=u'資源')
download = models.FileField(upload_to='course/resource/%Y/%m', verbose_name=u'下載地址', max_length=128)
name = models.CharField(max_length=128, verbose_name=u'資源名稱')
add_time = models.DateTimeField(default=datetime.now, verbose_name=u'添加時間')
class Meta:
verbose_name = u'資源信息'
verbose_name_plural = verbose_name
# _*_ encoding:utf-8 _*_
__author__ = 'wrj008'
__date__ = '2018/3/10 8:49'
import xadmin
from .models import Course, Lesson, Video, CourseResource, BannerCourse
class LessonAinline(object):
model = Lesson
extra = 0
class CourseAdmin(object):
list_display = ['name', 'desc', 'detail', 'degree', 'learn_time', 'students', 'fav_nums', 'click_nums', 'image',
'add_time']
search_fields = ['name', 'desc', 'detail', 'degree', 'learn_time', 'students', 'fav_nums', 'click_nums', 'image']
list_filter = ['name', 'desc', 'detail', 'degree', 'learn_time', 'students', 'fav_nums', 'click_nums', 'image',
'add_time']
inlines = [LessonAinline]
def queryset(self):
qs = super(CourseAdmin, self).queryset()
qs = qs.filter(is_banner=False)
return qs
class BannerCourseAdmin(object):
list_display = ['name', 'desc', 'detail', 'degree', 'learn_time', 'students', 'fav_nums', 'click_nums', 'image',
'add_time']
search_fields = ['name', 'desc', 'detail', 'degree', 'learn_time', 'students', 'fav_nums', 'click_nums', 'image']
list_filter = ['name', 'desc', 'detail', 'degree', 'learn_time', 'students', 'fav_nums', 'click_nums', 'image',
'add_time']
inlines = [LessonAinline]
def queryset(self):
qs = super(BannerCourseAdmin, self).queryset()
qs = qs.filter(is_banner=True)
return qs
class LessonAdmin(object):
list_display = ['course', 'name', 'add_time']
search_fields = ['course', 'name']
list_filter = ['course', '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', 'download', 'name', 'add_time']
search_fields = ['course', 'download', 'name']
list_filter = ['course', 'download', 'name', 'add_time']
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)
- 函數(shù)顯示
def get_lesson_count(self):
# 課程章節(jié)外鍵獲取總數(shù)
return self.lesson_set.all().count()
get_lesson_count.short_description = '章節(jié)數(shù)'
def go_to(self):
from django.utils.safestring import mark_safe
return mark_safe('<a href="www.baidu.com">跳轉(zhuǎn)</a>')
- 頁面自動刷新
class CourseAdmin(object):
list_display = ['name', 'desc', 'detail', 'degree', 'learn_time', 'students', 'fav_nums', 'click_nums', 'image',
'add_time']
search_fields = ['name', 'desc', 'detail', 'degree', 'learn_time', 'students', 'fav_nums', 'click_nums', 'image']
list_filter = ['name', 'desc', 'detail', 'degree', 'learn_time', 'students', 'fav_nums', 'click_nums', 'image',
'add_time']
inlines = [LessonAinline]
refresh_times = [3, 5]
def queryset(self):
qs = super(CourseAdmin, self).queryset()
qs = qs.filter(is_banner=False)
return qs
- 課程保存铣卡,機構(gòu)中課程數(shù)量更新
class CourseAdmin(object):
list_display = ['name', 'desc', 'detail', 'degree', 'learn_time', 'students', 'fav_nums', 'click_nums', 'image',
'add_time']
search_fields = ['name', 'desc', 'detail', 'degree', 'learn_time', 'students', 'fav_nums', 'click_nums', 'image']
list_filter = ['name', 'desc', 'detail', 'degree', 'learn_time', 'students', 'fav_nums', 'click_nums', 'image',
'add_time']
inlines = [LessonAinline]
refresh_times = [3, 5]
def queryset(self):
qs = super(CourseAdmin, self).queryset()
qs = qs.filter(is_banner=False)
return qs
def save_models(self):
"""
課程保存機構(gòu)課程數(shù)更新
"""
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()
富文本集成
富文本
某個字段使用某種樣式
style_fields = {'detail': 'ueditor'}
- django-ueditor 開源富文本文件插件功能開發(fā)
github 開源項目地址
1.進入文件目錄
cd ****
workon '虛擬環(huán)境'
python setup.py install
2.如果1沒效果,則采用源碼放入本地第三方保重偏竟,和xadmin一個文件夾下
壓縮包中的DjangoUeditor文件
注冊
INSTALLED_APPS = [
'DjangoUeditor',
]
配置url
# richtext url
url(r'^ueditor/', include('DjangoUeditor.urls'))
model字段進行變更
from DjangoUeditor.models import UEditorField
detail = UEditorField(verbose_name=u'課程詳情', width=600, height=300, toolbars="full", imagePath="course/ueditor/", filePath="course/ueditor/", default='')
plugin插件變更
# _*_ encoding:utf-8 _*_
__author__ = 'wrj008'
__date__ = '2018/3/19 16:41'
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") #自己的靜態(tài)目錄
js += '<script type="text/javascript" src="%s"></script>' % (settings.STATIC_URL + "ueditor/ueditor.all.min.js") #自己的靜態(tài)目錄
nodes.append(js)
xadmin.site.register_plugin(UeditorPlugin, UpdateAdminView)
xadmin.site.register_plugin(UeditorPlugin, CreateAdminView)
注冊插件
將ueditor添加到plugin下的_init_中
PLUGINS = (
...
'ueditor',
)
引用
class CourseAdmin(object):
list_display = ['name', 'desc', 'detail', 'degree', 'learn_time', 'students', 'fav_nums', 'click_nums', 'image',
'add_time']
search_fields = ['name', 'desc', 'detail', 'degree', 'learn_time', 'students', 'fav_nums', 'click_nums', 'image']
list_filter = ['name', 'desc', 'detail', 'degree', 'learn_time', 'students', 'fav_nums', 'click_nums', 'image',
'add_time']
inlines = [LessonAinline]
refresh_times = [3, 5]
style_fields = {'detail': 'ueditor'}
def queryset(self):
qs = super(CourseAdmin, self).queryset()
qs = qs.filter(is_banner=False)
return qs
def save_models(self):
"""
課程保存機構(gòu)課程數(shù)更新
"""
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()
詳情頁面展示
<div class="tab_cont tab_cont1">
{% autoescape off %}
{{ course.detail }}
{% endautoescape %}
</div>
- 本篇博客原視頻博主[慕課在線教育平臺]
- 本篇博客撰寫人: XiaoJinZi 轉(zhuǎn)載請注明出處
- 學(xué)生能力有限 附上郵箱: 986209501@qq.com 不足以及誤處請大佬指責(zé)