美文网首页Django在线教育平台
【Django在线教育平台】03.xadmin后台系统配置,将m

【Django在线教育平台】03.xadmin后台系统配置,将m

作者: 吾星喵 | 来源:发表于2019-06-04 14:30 被阅读106次

    专题: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_48

    admin后台管理中文

    修改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

    http://127.0.0.1:8000/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_79

    UserProfile已经被自动注册进去了,我们从验证码开始注册。

    需要新建一个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_displaysearch_fieldslist_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_50

    Github仓库项目

    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

    相关文章

      网友评论

        本文标题:【Django在线教育平台】03.xadmin后台系统配置,将m

        本文链接:https://www.haomeiwen.com/subject/nnwlxctx.html