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.可通過建立組,在組下配置一些許可權,將使用者新增到這個組中就具備了這個組的這些許可權
左側選單圖示設定:
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外掛
2.進入解壓目錄 執行cmd --> workon dj_education(進入虛擬環境)-->python setup.py install(安裝)
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)
前端富文字顯示轉義問題解決如下:
{% 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(ModelAdmin, self).post(request, args, kwargs)