您现在的位置是: 网站首页 >Django >Django2.0.8+xadmin2实现在线学习网站 Django
【Django在线教育平台】03.xadmin后台系统配置,将models注册到xadmin中
admin2019年6月4日 13:39
【Django | Html | JQuery
】
2389人已围观
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. ``` 使用自己定义的用户名密码可以登进系统。  ## 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) ```  首页 › 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/   ### 如何修复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的注册。  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) ``` 可以看到这时候访问已经有邮箱验证码了。  ### 验证码显示配置 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) ```  ### 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) ```   ## 注册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) ```   ### 章节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) ```   ### 视频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) ```   ### 资源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) ```   ## 注册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) ```       ## 注册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) ```  ## 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) ``` 不过这个新版,可能会存在主题不兼容情况  ### 修改Logo、我的公司和菜单折叠 ```python # Xadmin全局配置参数信息设置 class GlobalSettings(object): site_title = "学习平台后台管理" site_footer = "学习平台" # 收起菜单 menu_style = "accordion" # 将头部与脚部信息进行注册: xadmin.site.register(views.CommAdminView, GlobalSettings) ```  ### 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' ```  ### 自定义导航菜单顺序 ```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) ```  ### 日志记录的使用 日志记录会记录下我们进行过什么操作。  # Github仓库项目    然后会弹出框输入仓库名  选择要上传的项目点击git--->add  然后选择Commit   
很赞哦! (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的其它常见功能