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
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("百度一下")
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()
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 = '' % (settings.STATIC_URL + "ueditor/ueditor.config.js") #自己的静态目录
js += '' % (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 %}
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)