专题:Django2.0.8+xadmin2实现在线学习网站
Django2.0.8+xadmin2实现在线学习网站,课程、讲师、机构、用户收藏功能。GitHub地址:https://github.com/xyliurui/OnlineLearningPlatform ;Django版本:2.0.8
更多内容请点击 我的博客 查看,欢迎来访。
xadmin后台系统
后台管理系统特点
后台管理系统特点:
- 权限管理
- 少前端样式。(样式一般不是很看重),
- 快速开发
django的后台管理系统是一套智能的管理系统。
django的杀手锏之一就是admin管理系统。
admin在项目新建时就已经为我们生成好了。
INSTALLED_APPS = [
'django.contrib.admin',
# ....
]
Django的admin也是一个app,在我们新建项目时就创建好了。
而且会自动在url中配置好了链接。
from django.contrib import admin
from django.urls import path
urlpatterns = [
path('admin/', admin.site.urls),
]
访问 http://127.0.0.1:8000/admin/ 出错
django.db.utils.OperationalError: no such table: django_session
解决办法,执行一次全同步,或者是项目创建好后就执行一次同步
manage.py@DjangoOnlineLearningPlatform > makemigrations
manage.py@DjangoOnlineLearningPlatform > migrate
然后访问,可以看到admin的登录窗口。
Django是不会自动生成admin的用户的,需要我们自己去命令生成。
创建superuser
点击Tools 菜单下 Run manage.py Task
manage.py@DjangoOnlineLearningPlatform > createsuperuser
Username: admin
Email address: admin@admin.com
Warning: Password input may be echoed.
Password: djangoadmin
Warning: Password input may be echoed.
Password (again): djangoadmin
Superuser created successfully.
使用自己定义的用户名密码可以登进系统。
BLOG_20190604_134603_48admin后台管理中文
修改settings.py
# LANGUAGE_CODE = 'en-us'
# 语言改为中文
LANGUAGE_CODE = 'zh-hans'
# TIME_ZONE = 'UTC'
# 时区改为上海
TIME_ZONE = 'Asia/Shanghai'
USE_I18N = True
USE_L10N = True
# USE_TZ = True
# 数据库存储使用时间,True时间会被存为UTC的时间
USE_TZ = False
注册UserProfile到后台
现在只看到组显示,默认其实会把user也注册进来的,但是因为我们通过userProfile覆盖了user。所以没有显示。
修改users/admin.py
from django.contrib import admin
from .models import UserProfile
class UserProfileAdmin(admin.ModelAdmin):
pass
# 将UserProfile注册进我们的admin中, 并为它选择管理器
admin.site.register(UserProfile, UserProfileAdmin)
BLOG_20190604_134554_46
首页 › Users › 用户信息 › 增加 用户信息
进入页面可以看到Django为我们把每个不同类型的字段生成了不同的前端样式。
Django会自动帮我们把密码加密,而且不能反解。单向性。
xadmin源码安装
在项目下创建 extra_apps 文件夹
新建new package: extra_apps ,使用该目录存放我们的第三方插件
源码安装优点:
- xadmin新特性
- 对于源码进行自己的修改。
下载xadmin2
访问 https://github.com/sshwsfc/xadmin/tree/django2 下载适配Django2的版本,解压
将xadmin移入。右键mark为SourceRoot, 但是这时候cmd下会报错。
所以在setting.py中加入
sys.path.insert(0, os.path.join(BASE_DIR, 'apps')) # 添加apps搜索路径
sys.path.insert(0, os.path.join(BASE_DIR, 'extra_apps'))
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'users',
'courses',
'organization',
'operation',
'xadmin',
'crispy_forms',
'reversion'
]
添加xadmin的url
import xadmin
urlpatterns = [
path('admin/', admin.site.urls),
path(r'xadmin/', xadmin.site.urls),
]
安装运行的依赖包
官方需要的依赖包
django>=2
django-crispy-forms>=1.6.0
django-import-export>=0.5.1
django-reversion>=2.0.0
django-formtools==2.1
future==0.15.2
httplib2==0.9.2
six==1.10.0
按照要求安装,这儿我安装都最新版的试试
pip install django-crispy-forms
pip install django-import-export
pip install django-reversion
pip install django-formtools
pip install future
pip install httplib2
pip install six
# 安装完成后的库列表
> pip freeze
diff-match-patch==20121119
Django==2.1
django-crispy-forms==1.7.2
django-formtools==2.1
django-import-export==1.0.1
django-reversion==3.0.0
et-xmlfile==1.0.1
future==0.16.0
httplib2==0.11.3
jdcal==1.4
odfpy==1.3.6
openpyxl==2.5.5
Pillow==5.2.0
pytz==2018.5
PyYAML==3.13
six==1.11.0
tablib==0.12.1
unicodecsv==0.14.1
xlrd==1.1.0
xlwt==1.3.0
同步xadmin数据库
执行同步,自动创建xadmin的表,如果没同步,访问xadmin会报错。
manage.py@DjangoOnlineLearningPlatform > makemigrations
manage.py@DjangoOnlineLearningPlatform > migrate
访问xadmin
BLOG_20190604_134539_62[图片上传失败...(image-d6a45c-1559629762393)]
如何修复xadmin编辑文件类型模型的bug
TypeError: render() got an unexpected keyword argument 'renderer'
未能解决,这个问题都出现在有Image字段的模型中,编辑或新增的时候出现
更换Django版本得以解决,从Django2.1降到Django2.0.8
(Venv_learning_platform) D:\Apps\Python>pip install Django==2.0.8 -i https://pypi.douban.com/simple
Looking in indexes: https://pypi.douban.com/simple
Collecting Django==2.0.8
Downloading https://pypi.doubanio.com/packages/2b/85/337bfa37c4b82f59ee9b8deca55a8daa7ef16c8cdfa86d273625bc6ed887/Django-2.0.8-py3-none-any.whl (7.1MB)
100% |████████████████████████████████| 7.1MB 25.6MB/s
Requirement already satisfied: pytz in d:\apps\python\venv_learning_platform\lib\site-packages (from Django==2.0.8) (2018.5)
Installing collected packages: Django
Found existing installation: Django 2.1
Uninstalling Django-2.1:
Successfully uninstalled Django-2.1
Successfully installed Django-2.0.8
后面再测试了
注册users应用的模型
Xadmin是基于Django的admin来开发的,所以Xadmin也继承了许多admin的用法。
比如: models的注册。
BLOG_20190604_134519_79UserProfile已经被自动注册进去了,我们从验证码开始注册。
需要新建一个adminx.py文件,Xadmin会自动搜寻这种命名的文件。
新建users/adminx.py
验证码models注册到xadmin
import xadmin
from .models import EmailVerifyRecord
class EmailVerifyRecordAdmin(object):
pass
xadmin.site.register(EmailVerifyRecord, EmailVerifyRecordAdmin)
可以看到这时候访问已经有邮箱验证码了。
BLOG_20190604_134512_42验证码显示配置
users/adminx.py的管理器中设置list_display
、search_fields
,list_filter
:
# 创建admin的管理类,这里不再是继承admin,而是继承object
class EmailVerifyRecordAdmin(object):
# 配置后台需要显示的列
list_display = ['code', 'email', 'send_type', 'send_time']
# 配置搜索字段,不做时间搜索
search_fields = ['code', 'email', 'send_type']
# 配置筛选字段---过滤器
list_filter = ['code', 'email', 'send_type', 'send_time']
xadmin.site.register(EmailVerifyRecord, EmailVerifyRecordAdmin)
BLOG_20190604_134504_34
Django的admin, Xadmin和其他系统区别
不像php等其他语言是一个功能模块一个功能设计的。
Django是对于每张表增删改查的管理器,我们可以在增删改成的基础上加上我们自己的后台逻辑。
因此某种程度可以说他是不依赖于具体业务的。不管啥系统后台都是由表组成。
不依赖于后台逻辑,又可以加上逻辑。
轮播图models注册到xadmin
from .models import EmailVerifyRecord, Banner
# 创建banner的管理类
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']
# 将model与admin管理器进行关联注册
xadmin.site.register(Banner, BannerAdmin)
BLOG_20190604_134455_49
BLOG_20190604_134450_64
注册courses应用的模型
新建courses/adminx.py
课程models注册到xadmin
import xadmin
from .models import Course, Lesson, Video, CourseResource
# 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进行注册关联
xadmin.site.register(Course, CourseAdmin)
BLOG_20190604_134442_36
BLOG_20190604_134431_65
章节models注册到xadmin
class LessonAdmin(object):
list_display = ['course', 'name', 'add_time']
search_fields = ['course', 'name']
# __name代表使用外键中name字段
list_filter = ['course__name', 'name', 'add_time']
xadmin.site.register(Lesson, LessonAdmin)
BLOG_20190604_134424_94
BLOG_20190604_134418_30
视频models注册到xadmin
class VideoAdmin(object):
list_display = ['lesson', 'name', 'add_time']
search_fields = ['lesson', 'name']
list_filter = ['lesson', 'name', 'add_time']
xadmin.site.register(Video, VideoAdmin)
BLOG_20190604_134411_70
[图片上传失败...(image-699bc5-1559629762393)]
资源models注册到xadmin
lass CourseResourceAdmin(object):
list_display = ['course', 'name', 'download', 'add_time']
search_fields = ['course', 'name', 'download']
# __name代表使用外键中name字段
list_filter = ['course__name', 'name', 'download', 'add_time']
xadmin.site.register(CourseResource, CourseResourceAdmin)
BLOG_20190604_134359_33
BLOG_20190604_134355_25
注册organization应用的模型
新建organization/adminx.py
所有models注册到xadmin
import xadmin
from .models import CityDict, CourseOrg, Teacher
# 机构所属城市名后台管理器
class CityDictAdmin(object):
list_display = ['name', 'desc', 'add_time']
search_fields = ['name', 'desc']
list_filter = ['name', 'desc', 'add_time']
# 机构课程信息管理器
class CourseOrgAdmin(object):
list_display = ['name', 'desc', 'click_nums', 'fav_nums', 'add_time']
search_fields = ['name', 'desc', 'click_nums', 'fav_nums']
list_filter = ['name', 'desc', 'click_nums', 'fav_nums', 'city__name', 'address', 'add_time']
class TeacherAdmin(object):
list_display = ['name', 'org', 'work_years', 'work_company', 'add_time']
search_fields = ['org', 'name', 'work_years', 'work_company']
list_filter = ['org__name', 'name', 'work_years', 'work_company', 'click_nums', 'fav_nums', 'add_time']
xadmin.site.register(CityDict, CityDictAdmin)
xadmin.site.register(CourseOrg, CourseOrgAdmin)
xadmin.site.register(Teacher, TeacherAdmin)
BLOG_20190604_134347_70
BLOG_20190604_134343_87
BLOG_20190604_134336_30
BLOG_20190604_134330_88
BLOG_20190604_134325_46
BLOG_20190604_134320_32
注册operation应用的模型
新建operation/adminx.py
所有models注册到xadmin
import xadmin
from .models import UserAsk, UserCourse, UserMessage, CourseComments, UserFavorite
# 用户表单我要学习后台管理器
class UserAskAdmin(object):
list_display = ['name', 'mobile', 'course_name', 'add_time']
search_fields = ['name', 'mobile', 'course_name']
list_filter = ['name', 'mobile', 'course_name', 'add_time']
# 用户课程学习后台管理器
class UserCourseAdmin(object):
list_display = ['user', 'course', 'add_time']
search_fields = ['user', 'course']
list_filter = ['user', 'course', 'add_time']
# 用户消息后台管理器
class UserMessageAdmin(object):
list_display = ['user', 'message', 'has_read', 'add_time']
search_fields = ['user', 'message', 'has_read']
list_filter = ['user', 'message', 'has_read', 'add_time']
# 用户评论后台管理器
class CourseCommentsAdmin(object):
list_display = ['user', 'course', 'comments', 'add_time']
search_fields = ['user', 'course', 'comments']
list_filter = ['user', 'course', 'comments', 'add_time']
# 用户收藏后台管理器
class UserFavoriteAdmin(object):
list_display = ['user', 'fav_id', 'fav_type', 'add_time']
search_fields = ['user', 'fav_id', 'fav_type']
list_filter = ['user', 'fav_id', 'fav_type', 'add_time']
# 将后台管理器与models进行关联注册。
xadmin.site.register(UserAsk, UserAskAdmin)
xadmin.site.register(UserCourse, UserCourseAdmin)
xadmin.site.register(UserMessage, UserMessageAdmin)
xadmin.site.register(CourseComments, CourseCommentsAdmin)
xadmin.site.register(UserFavorite, UserFavoriteAdmin)
BLOG_20190604_134310_96
xadmin全局配置
将全局配置修改:
- 如左上角:Django Xadmin
- 下面的我的公司
- 主题更改
- app名称汉化,菜单收叠
把全站的配置放在users\adminx.py中
开启主题功能
import xadmin
from xadmin import views
# 创建Xadmin的全局管理器并与view绑定。
class BaseSetting(object):
# 开启主题功能
enable_themes = True
use_bootswatch = True
# 将全局配置管理与view绑定注册
xadmin.site.register(views.BaseAdminView, BaseSetting)
不过这个新版,可能会存在主题不兼容情况
BLOG_20190604_134303_12修改Logo、我的公司和菜单折叠
# Xadmin全局配置参数信息设置
class GlobalSettings(object):
site_title = "学习平台后台管理"
site_footer = "学习平台"
# 收起菜单
menu_style = "accordion"
# 将头部与脚部信息进行注册:
xadmin.site.register(views.CommAdminView, GlobalSettings)
BLOG_20190604_134251_99
app显示名称修改中文
每个app下执行同样操作,修改app.py文件
from django.apps import AppConfig
class UsersConfig(AppConfig):
name = 'users'
verbose_name = '用户'
每个app下修改init.py文件
default_app_config = 'users.apps.UsersConfig'
from django.apps import AppConfig
class OrganizationConfig(AppConfig):
name = 'organization'
verbose_name = '机构'
default_app_config = 'organization.apps.OrganizationConfig'
from django.apps import AppConfig
class OperationConfig(AppConfig):
name = 'operation'
verbose_name = '操作'
default_app_config = 'operation.apps.OperationConfig'
from django.apps import AppConfig
class CoursesConfig(AppConfig):
name = 'courses'
verbose_name = '课程'
default_app_config = 'courses.apps.CoursesConfig'
BLOG_20190604_134241_75
自定义导航菜单顺序
from .models import EmailVerifyRecord, Banner, UserProfile
from courses.models import *
from organization.models import *
from operation.models import *
from django.contrib.auth.models import Group, Permission
from xadmin.models import Log
# Xadmin全局配置参数信息设置
class GlobalSettings(object):
site_title = "学习平台后台管理"
site_footer = "学习平台"
# 收起菜单
menu_style = "accordion"
# 自定义菜单显示
def get_site_menu(self):
return (
{'title': '课程管理', 'menus': (
{'title': '课程信息', 'url': self.get_model_url(Course, 'changelist')},
{'title': '章节信息', 'url': self.get_model_url(Lesson, 'changelist')},
{'title': '视频信息', 'url': self.get_model_url(Video, 'changelist')},
{'title': '课程资源', 'url': self.get_model_url(CourseResource, 'changelist')},
{'title': '课程评论', 'url': self.get_model_url(CourseComments, 'changelist')},
)},
{'title': '机构管理', 'menus': (
{'title': '所在城市', 'url': self.get_model_url(CityDict, 'changelist')},
{'title': '机构讲师', 'url': self.get_model_url(Teacher, 'changelist')},
{'title': '机构信息', 'url': self.get_model_url(CourseOrg, 'changelist')},
)},
{'title': '用户管理', 'menus': (
{'title': '用户信息', 'url': self.get_model_url(UserProfile, 'changelist')},
{'title': '用户验证', 'url': self.get_model_url(EmailVerifyRecord, 'changelist')},
{'title': '用户课程', 'url': self.get_model_url(UserCourse, 'changelist')},
{'title': '用户收藏', 'url': self.get_model_url(UserFavorite, 'changelist')},
{'title': '用户消息', 'url': self.get_model_url(UserMessage, 'changelist')},
)},
{'title': '系统管理', 'menus': (
{'title': '用户咨询', 'url': self.get_model_url(UserAsk, 'changelist')},
{'title': '首页轮播', 'url': self.get_model_url(Banner, 'changelist')},
{'title': '用户分组', 'url': self.get_model_url(Group, 'changelist')},
{'title': '用户权限', 'url': self.get_model_url(Permission, 'changelist')},
{'title': '日志记录', 'url': self.get_model_url(Log, 'changelist')},
)},
)
# 将头部与脚部信息进行注册:
xadmin.site.register(views.CommAdminView, GlobalSettings)
[图片上传失败...(image-47aef-1559629762393)]
日志记录的使用
日志记录会记录下我们进行过什么操作。
BLOG_20190604_134223_50Github仓库项目
BLOG_20190604_134211_11 BLOG_20190604_134206_78[图片上传失败...(image-f859e8-1559629762393)]
然后会弹出框输入仓库名
BLOG_20190604_134154_17选择要上传的项目点击git--->add
BLOG_20190604_134149_18然后选择Commit
BLOG_20190604_134144_66 BLOG_20190604_134140_32 BLOG_20190604_134133_22
网友评论