您现在的位置是: 网站首页 >Django >Django2.0.8+xadmin2实现在线学习网站 Django
【Django在线教育平台】03.xadmin后台系统配置,将models注册到xadmin中
admin2019年6月4日 13:39 【Django | Html | JQuery 】 2127人已围观
Django2.0.8+xadmin2实现在线学习网站简介 Django2.0.8+xadmin2实现在线学习网站,课程、讲师、机构、用户收藏功能。GitHub地址:https://github.com/xyliurui/OnlineLearningPlatform ;Django版本:2.0.8
# xadmin后台系统 ## 后台管理系统特点 后台管理系统特点: * 权限管理 * 少前端样式。(样式一般不是很看重), * 快速开发 django的后台管理系统是一套智能的管理系统。 django的杀手锏之一就是admin管理系统。 admin在项目新建时就已经为我们生成好了。 ```python INSTALLED_APPS = [ 'django.contrib.admin', # .... ] ``` Django的admin也是一个app,在我们新建项目时就创建好了。 而且会自动在url中配置好了链接。 ```python from django.contrib import admin from django.urls import path urlpatterns = [ path('admin/', admin.site.urls), ] ``` 访问 http://127.0.0.1:8000/admin/ 出错 ```python django.db.utils.OperationalError: no such table: django_session ``` 解决办法,执行一次全同步,或者是项目创建好后就执行一次同步 ```python manage.py@DjangoOnlineLearningPlatform > makemigrations manage.py@DjangoOnlineLearningPlatform > migrate ``` 然后访问,可以看到admin的登录窗口。 Django是不会自动生成admin的用户的,需要我们自己去命令生成。 ## 创建superuser 点击Tools 菜单下 Run manage.py Task ```python 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_48](/media/blog/images/2019/06/BLOG_20190604_134603_48.png "博客图集BLOG_20190604_134603_48.png") ## admin后台管理中文 修改settings.py ```python # 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 ```python 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](/media/blog/images/2019/06/BLOG_20190604_134554_46.png "博客图集BLOG_20190604_134554_46.png") 首页 › 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中加入 ```python 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 ```python import xadmin urlpatterns = [ path('admin/', admin.site.urls), path(r'xadmin/', xadmin.site.urls), ] ``` ### 安装运行的依赖包 官方需要的依赖包 ```python 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 ``` 按照要求安装,这儿我安装都最新版的试试 ```python 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会报错。 ```python manage.py@DjangoOnlineLearningPlatform > makemigrations manage.py@DjangoOnlineLearningPlatform > migrate ``` ### 访问xadmin http://127.0.0.1:8000/xadmin/ ![BLOG_20190604_134539_62](/media/blog/images/2019/06/BLOG_20190604_134539_62.png "博客图集BLOG_20190604_134539_62.png") ![BLOG_20190604_134531_92](/media/blog/images/2019/06/BLOG_20190604_134531_92.png "博客图集BLOG_20190604_134531_92.png") ### 如何修复xadmin编辑文件类型模型的bug ``` TypeError: render() got an unexpected keyword argument 'renderer' ``` **未能解决,这个问题都出现在有Image字段的模型中,编辑或新增的时候出现** 更换Django版本得以解决,从Django2.1降到Django2.0.8 ```python (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_79](/media/blog/images/2019/06/BLOG_20190604_134519_79.png "博客图集BLOG_20190604_134519_79.png") UserProfile已经被自动注册进去了,我们从验证码开始注册。 *需要新建一个adminx.py文件,Xadmin会自动搜寻这种命名的文件。* **新建users/adminx.py** ### 验证码models注册到xadmin ```python import xadmin from .models import EmailVerifyRecord class EmailVerifyRecordAdmin(object): pass xadmin.site.register(EmailVerifyRecord, EmailVerifyRecordAdmin) ``` 可以看到这时候访问已经有邮箱验证码了。 ![BLOG_20190604_134512_42](/media/blog/images/2019/06/BLOG_20190604_134512_42.png "博客图集BLOG_20190604_134512_42.png") ### 验证码显示配置 users/adminx.py的管理器中设置l`ist_display`、`search_fields`,`list_filter`: ```python # 创建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](/media/blog/images/2019/06/BLOG_20190604_134504_34.png "博客图集BLOG_20190604_134504_34.png") ### Django的admin, Xadmin和其他系统区别 >不像php等其他语言是一个功能模块一个功能设计的。 > Django是对于每张表增删改查的管理器,我们可以在增删改成的基础上加上我们自己的后台逻辑。 > 因此某种程度可以说他是不依赖于具体业务的。不管啥系统后台都是由表组成。 不依赖于后台逻辑,又可以加上逻辑。 ### 轮播图models注册到xadmin ```python 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](/media/blog/images/2019/06/BLOG_20190604_134455_49.png "博客图集BLOG_20190604_134455_49.png") ![BLOG_20190604_134450_64](/media/blog/images/2019/06/BLOG_20190604_134450_64.png "博客图集BLOG_20190604_134450_64.png") ## 注册courses应用的模型 **新建courses/adminx.py** ### 课程models注册到xadmin ```python 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](/media/blog/images/2019/06/BLOG_20190604_134442_36.png "博客图集BLOG_20190604_134442_36.png") ![BLOG_20190604_134431_65](/media/blog/images/2019/06/BLOG_20190604_134431_65.png "博客图集BLOG_20190604_134431_65.png") ### 章节models注册到xadmin ```python 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](/media/blog/images/2019/06/BLOG_20190604_134424_94.png "博客图集BLOG_20190604_134424_94.png") ![BLOG_20190604_134418_30](/media/blog/images/2019/06/BLOG_20190604_134418_30.png "博客图集BLOG_20190604_134418_30.png") ### 视频models注册到xadmin ```python 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](/media/blog/images/2019/06/BLOG_20190604_134411_70.png "博客图集BLOG_20190604_134411_70.png") ![BLOG_20190604_134406_61](/media/blog/images/2019/06/BLOG_20190604_134406_61.png "博客图集BLOG_20190604_134406_61.png") ### 资源models注册到xadmin ```python 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](/media/blog/images/2019/06/BLOG_20190604_134359_33.png "博客图集BLOG_20190604_134359_33.png") ![BLOG_20190604_134355_25](/media/blog/images/2019/06/BLOG_20190604_134355_25.png "博客图集BLOG_20190604_134355_25.png") ## 注册organization应用的模型 **新建organization/adminx.py** ### 所有models注册到xadmin ```python 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](/media/blog/images/2019/06/BLOG_20190604_134347_70.png "博客图集BLOG_20190604_134347_70.png") ![BLOG_20190604_134343_87](/media/blog/images/2019/06/BLOG_20190604_134343_87.png "博客图集BLOG_20190604_134343_87.png") ![BLOG_20190604_134336_30](/media/blog/images/2019/06/BLOG_20190604_134336_30.png "博客图集BLOG_20190604_134336_30.png") ![BLOG_20190604_134330_88](/media/blog/images/2019/06/BLOG_20190604_134330_88.png "博客图集BLOG_20190604_134330_88.png") ![BLOG_20190604_134325_46](/media/blog/images/2019/06/BLOG_20190604_134325_46.png "博客图集BLOG_20190604_134325_46.png") ![BLOG_20190604_134320_32](/media/blog/images/2019/06/BLOG_20190604_134320_32.png "博客图集BLOG_20190604_134320_32.png") ## 注册operation应用的模型 **新建operation/adminx.py** ### 所有models注册到xadmin ```python 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](/media/blog/images/2019/06/BLOG_20190604_134310_96.png "博客图集BLOG_20190604_134310_96.png") ## xadmin全局配置 将全局配置修改: * 如左上角:Django Xadmin * 下面的我的公司 * 主题更改 * app名称汉化,菜单收叠 把全站的配置放在users\adminx.py中 ### 开启主题功能 ```python 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](/media/blog/images/2019/06/BLOG_20190604_134303_12.png "博客图集BLOG_20190604_134303_12.png") ### 修改Logo、我的公司和菜单折叠 ```python # Xadmin全局配置参数信息设置 class GlobalSettings(object): site_title = "学习平台后台管理" site_footer = "学习平台" # 收起菜单 menu_style = "accordion" # 将头部与脚部信息进行注册: xadmin.site.register(views.CommAdminView, GlobalSettings) ``` ![BLOG_20190604_134251_99](/media/blog/images/2019/06/BLOG_20190604_134251_99.png "博客图集BLOG_20190604_134251_99.png") ### app显示名称修改中文 每个app下执行同样操作,修改app.py文件 ```python from django.apps import AppConfig class UsersConfig(AppConfig): name = 'users' verbose_name = '用户' ``` 每个app下修改__init__.py文件 ```python default_app_config = 'users.apps.UsersConfig' ``` ```python from django.apps import AppConfig class OrganizationConfig(AppConfig): name = 'organization' verbose_name = '机构' ``` ```python default_app_config = 'organization.apps.OrganizationConfig' ``` ```python from django.apps import AppConfig class OperationConfig(AppConfig): name = 'operation' verbose_name = '操作' ``` ```python default_app_config = 'operation.apps.OperationConfig' ``` ```python from django.apps import AppConfig class CoursesConfig(AppConfig): name = 'courses' verbose_name = '课程' ``` ```python default_app_config = 'courses.apps.CoursesConfig' ``` ![BLOG_20190604_134241_75](/media/blog/images/2019/06/BLOG_20190604_134241_75.png "博客图集BLOG_20190604_134241_75.png") ### 自定义导航菜单顺序 ```python 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) ``` ![BLOG_20190604_134233_60](/media/blog/images/2019/06/BLOG_20190604_134233_60.png "博客图集BLOG_20190604_134233_60.png") ### 日志记录的使用 日志记录会记录下我们进行过什么操作。 ![BLOG_20190604_134223_50](/media/blog/images/2019/06/BLOG_20190604_134223_50.png "博客图集BLOG_20190604_134223_50.png") # Github仓库项目 ![BLOG_20190604_134211_11](/media/blog/images/2019/06/BLOG_20190604_134211_11.png "博客图集BLOG_20190604_134211_11.png") ![BLOG_20190604_134206_78](/media/blog/images/2019/06/BLOG_20190604_134206_78.png "博客图集BLOG_20190604_134206_78.png") ![BLOG_20190604_134200_83](/media/blog/images/2019/06/BLOG_20190604_134200_83.png "博客图集BLOG_20190604_134200_83.png") 然后会弹出框输入仓库名 ![BLOG_20190604_134154_17](/media/blog/images/2019/06/BLOG_20190604_134154_17.png "博客图集BLOG_20190604_134154_17.png") 选择要上传的项目点击git--->add ![BLOG_20190604_134149_18](/media/blog/images/2019/06/BLOG_20190604_134149_18.png "博客图集BLOG_20190604_134149_18.png") 然后选择Commit ![BLOG_20190604_134144_66](/media/blog/images/2019/06/BLOG_20190604_134144_66.png "博客图集BLOG_20190604_134144_66.png") ![BLOG_20190604_134140_32](/media/blog/images/2019/06/BLOG_20190604_134140_32.png "博客图集BLOG_20190604_134140_32.png") ![BLOG_20190604_134133_22](/media/blog/images/2019/06/BLOG_20190604_134133_22.png "博客图集BLOG_20190604_134133_22.png")
很赞哦! (1)
相关文章
文章交流
- emoji
当前用户
未登录,点击 登录专题目录
- 【Django在线教育平台】01.创建Django虚拟环境和项目
- 【Django在线教育平台】02.创建该项目用到的数据库模型类
- 【Django在线教育平台】03.xadmin后台系统配置,将models注册到xadmin中
- 【Django在线教育平台】04.模板配置,完成用户登录相关页面和逻辑
- 【Django在线教育平台】05.用户注册功能实现
- 【Django在线教育平台】06.找回密码,实现忘记密码及重置密码功能
- 【Django在线教育平台】07.授课机构列表显示,分页、分类筛选、排序功能
- 【Django在线教育平台】08.学习咨询表单ajax提交
- 【Django在线教育平台】09.机构详情、机构课程详情页
- 【Django在线教育平台】10.机构讲师、机构介绍详情页
- 【Django在线教育平台】11.机构收藏功能实现
- 【Django在线教育平台】12.课程列表及详情展示
- 【Django在线教育平台】13.课程内容页,该课程评论功能
- 【Django在线教育平台】14.用户登陆后开始学习,播放课程视频
- 【Django在线教育平台】15.授课讲师列表和详情功能
- 【Django在线教育平台】16.导航选中状态,全局搜索功能实现
- 【Django在线教育平台】17.个人中心用户修改密码、头像
- 【Django在线教育平台】18.个人中心修改邮箱及其他信息
- 【Django在线教育平台】19.个人中心显示我的课程、收藏、消息页面
- 【Django在线教育平台】20.用户退出功能
- 【Django在线教育平台】21.其他功能完善
- 【Django在线教育平台】22.xadmin的其它常见功能