Django在线教育平台

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

2019-06-04  本文已影响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 ,使用该目录存放我们的第三方插件

源码安装优点:

下载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全局配置

将全局配置修改:

把全站的配置放在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
上一篇下一篇

猜你喜欢

热点阅读