django+xadmin在线教育平台(九)

django admin介绍

上一章咱们进行了需求分析和数据库设计。本章咱们来快速搭建一个可用的后台管理系统。javascript

后台管理系统特色:php

  • 权限管理
  • 少前端样式。(样式通常不是很看重),
  • 快速开发

django的后台管理系统是一套智能的管理系统。
django的杀手锏之一就是admin管理系统。css

admin在项目新建时就已经为咱们生成好了。html

 
mark

Django的admin也是一个app,在咱们新建项目时就建立好了。
并且会自动在url中配置好了连接。前端

 
mark

访问:http://127.0.0.1:8000/admin/java

能够看到admin的登陆窗口。python

Django是不会自动生成admin的用户的,须要咱们本身去命令生成。mysql

createsuperuser

点击Tools 菜单下 Run manage.py Taskgit

createsuperuser
 
mark

输入本身的用户名密码。github

报错:

django.db.utils.DataError: (1406, "Data too long for column 'gender' at row 1") 

gender中female是6位。而咱们最大长度只有5.

 
mark

修改后

makemigrations users
migrate users

而后从新createsuperuser

使用本身定义的用户名密码能够登进系统。

 
mark

默认是用户名 + 密码。后面会讲到如何实现用户名 或 邮箱和密码登陆。

修改setting中对应语言,时区,以及数据库写入时间。

修改

# 语言改成中文 LANGUAGE_CODE = 'zh-hans' # 时区改成上海 TIME_ZONE = 'Asia/Shanghai' # 数据库存储使用时间,True时间会被存为UTC的时间 USE_TZ = False 

点击运行能够看到以下图被换成汉语的效果:

 
mark

注意: django 2.0.1 并不会看到汉化后的默认页面。只有admin被汉化了。

组对应数据表: auth_group

在Django的admin中能够把上章的表都注册进来。对于表进行任意的增删改查。

默认其实会把user也注册进来的,可是由于咱们经过userProfile覆盖了user。因此没有显示。

注册UserProfile进来

users/admin.py:

# encoding: utf-8 # 由于同一个目录,因此能够直接.models from .models import UserProfile # 写一个管理器:命名, model+Admin class UserProfileAdmin(admin.ModelAdmin): pass # 将UserProfile注册进咱们的admin中, 并为它选择管理器 admin.site.register(UserProfile,UserProfileAdmin) 
 
mark

能够看到咱们的用户信息就注册进来了。

USERS 是用户所在表名称。

 
mark

进入页面能够看到Django为咱们把每一个不一样类型的字段生成了不一样的前端样式。

 
mark

Django会自动帮咱们把密码加密,并且不能反解。单向性。

若是出现错误, 多是initial文件在咱们拖入apps时路径被改变。以后咱们添加了环境变量, 前面再加上apps就会报错。

这时把initial.py 中路径进行修改。

错误2:

新增用户信息提示:
Cannot add or update a child row: a foreign key constraint fails (1452, 'Cannot add or update a child row: a foreign key constraint fails `mxonline`.`django_admin_log`, CONSTRAINT `django_admin_log_user_id_c564eba6_fk_auth_user_id` FOREIGN KEY (`user_id`) REFERENCES `auth_user` (`id`))') 

解决方案1: 不用解决,以后换Xadmin就行了。

解决方案2: 在setting的databases中添加如下代码取消外键检查

DATABASES = {
    'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'mxonline2', 'USER': 'root', 'PASSWORD': '你的密码', 'HOST':'127.0.0.1', 'OPTIONS': { "init_command": "SET foreign_key_checks=0;", } }, } 
 
mark

实验成功为了避免影响后面,把options删除

本小节结束对应commit:

admin中添加管理器&注册。时区,语言,utc(False).数据库中选项参数。female的长度修改, createsuperuser.对应5-1

xadmin的安装

一套基于admin, 比admin更强大的系统。

  1. 经过pip安装
pip install xadmin

Python3 & Django2.0.1安装官方适配Django2.0的包

pip install git+git://github.com/sshwsfc/xadmin.git@django2 

xadmin能够把咱们的后台作的很强大,可扩展。

 
mark

能够看到它同时下载了不少其余依赖包。

注册Xadmin 与 crispy-forms

Mxonline2/settings.py的INSTALLED_APPS中

'xadmin', 'crispy_forms' 

而后把urls中默认admin指向Xadmin

# 导入x admin,替换admin import xadmin urlpatterns = [ url(r'^xadmin/', xadmin.site.urls), ] 

Python3 Django2.0.1 的url的配置中

path('xadmin/', xadmin.site.urls), 

注意:Django 2.0.1中不须要加r也不须要加^

将咱们原来写的user/admin.py中代码注释掉。

此时直接运行项目会报错,由于咱们Xadmin的默认数据表并无migarte

ProgrammingError: (1146, "Table 'mxonline2.xadmin_usersettings' doesn't exist") [09/Jan/2018 06:40:27] "GET /xadmin/ HTTP/1.1" 500 150414 

点击Tools 菜单下 Run manage.py Task

makemigrations
migrate
 
mark

能够看到已经被应用成功。

前往Navicat进行验证。

 
mark

能够看到新增的表。

Xadmin的后台采用的是bootstrap。

 
mark

后面咱们会介绍如何制做插件

源码安装:

github: https://github.com/sshwsfc/xadmin

下载或git clone将源码下载到本地。

 
mark

解压后将Xadmin文件夹复制到咱们的项目中。

 
mark

Python3版本源码安装:与url配置不一样

git clone -b django2 https://github.com/sshwsfc/xadmin.git 

其他操做同样。

新建extra_apps,并在setting中注册地址

新建new package: extra_apps

使用该目录存放咱们的第三方插件,将Xadmin移入。
右键mark为SourceRoot, 可是这时候cmd下回报错。

因此在setting.py中加入。

sys.path.insert(0,os.path.join(BASE_DIR, 'extra_apps')) 

由于咱们的source目录已经有Xadmin了,就不会再去系统环境中找了。这时候卸载咱们的Xadmin。

workon mxonline2
pip uninstall xadmin

可是他的依赖包咱们还须要,因此只须要卸载Xadmin。此时咱们运行会报错

from future.utils import iteritems ImportError: No module named future.utils 

安装必要的包:

pip install future
pip install six
pip install httplib2
pip install django-import-export 

此时又能够成功运行了

 
mark

日志记录:后台管理人员作的操做都会生成一条记录。

源码安装优势:

  • xadmin新特性
  • 对于源码进行本身的修改。

本小节结束对应commit:

Xadmin的安装与源码安装,配置setting中extra_apps. 对应5-2

users app 的model注册

遗留问题: django2.0.1使用xadmin时。如验证码等带dateTimefield区域出错。

xadmin/widgets.py

 
mark
input_html = [ht for ht in super(AdminSplitDateTime, self).render( name, value, attrs).split('/><') if ht != ''] if (len(input_html) > 1): input_html[0] = input_html[0] + "/>" input_html[1] = "<" + input_html[1] 
 
mark

此时能够看到已经运行正常

真正开始

Xadmin是基于Django的admin来开发的,因此Xadmin也继承了许多admin的用法。

  • 好比: models的注册。

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

咱们须要新建一个adminx.py文件,Xadmin会自动搜寻这种命名的文件。

新建py文件的初始化模板

 
mark

新建users/adminx.py:

# encoding: utf-8 __author__ = 'mtianyan' __date__ = '2018/1/9 0009 08:02' import xadmin from .models import EmailVerifyRecord # 建立admin的管理类,这里再也不是继承admin,而是继承object class EmailVerifyRecordAdmin(object): pass xadmin.site.register(EmailVerifyRecord, EmailVerifyRecordAdmin) 
 
mark

能够看到这时候访问已经有邮箱验证码了。

邮箱验证码这几个字就是咱们代码中Meta中verbose_name定义的:

class Meta: verbose_name = "邮箱验证码" verbose_name_plural = verbose_name 

verbose_name_pluralverbose_name的复数形式。

字段的verbose_name会直接显示在后台。sendtypesendtime没有设置因此直接显示了英文。

 
mark

能够看到咱们添加验证码成功。注意:上节版本中咱们进行了: makemigaration & migrate。
可是它是pip安装的Xadmin的数据表生成。咱们卸载以后,源码安装须要从新运行进行数据迁移。(django须要经过app文件夹下的init文件来记录表的更改记录,pip的都卸了,因此就无法找到了)

会报错:

Xadmin_log不存在错误。只须要运行这两条命令便可。

 
mark

解决后台部分英文显示

所有models中字段自行添加verbose_name

 
mark

这里就不贴出来了,自行检查都加上(没写出的请自行修改所有加上verbose_name)。

解决EmailVerifyRecord object显示

所有(没写出的请自行修改)model,py2:重载__unicode py3:重载__str__

# 重载Unicode方法使后台再也不直接显示object def __unicode__(self): return '{0}({1})'.format(self.code,self.email) 

上面代码是python的自身基础语法。

 
mark
 
mark

配置显示列

 
mark

users/adminx.py的管理器中设置list_display:

# 建立admin的管理类,这里再也不是继承admin,而是继承object class EmailVerifyRecordAdmin(object): # 配置后台咱们须要显示的列 list_display = ['code', 'email','send_type', 'send_time'] 

list_display可使用列表或元祖,建议使用列表。不然元组只有一个元素,忘记加逗号就会报错。

 
mark

选择框的生成是由于咱们加上了choices

配置搜索searchfield

users/adminx.py的管理器中EmailVerifyRecordAdmin添加

# 配置搜索字段,不作时间搜索 search_fields = ['code', 'email','send_type'] 
 
mark

再添加一条数据验证搜索功能

 
mark
 
mark

xadmin导出csv中文乱码解决

 
mark

charset=utf-8 改成charset=gbk

xadmin导出xml报错

TypeError at /xadmin/users/emailverifyrecord/ unicode argument expected, got 'str' 

io.StringIO这个库新版本的python3直接往这个库中加入了一些新的内容,使得该库在Python2.7中较为混乱。

 
mark

将StringIo变为BytesIO

经过时间筛选字段。

users/adminx.py的管理器中EmailVerifyRecordAdmin添加

# 配置筛选字段 list_filter = ['code', 'email','send_type', 'send_time'] 
 
mark

Django的admin, Xadmin和其余系统区别

不像php等其余语言是一个功能模块一个功能设计的。
Django是对于每张表增删改查的管理器,咱们能够在增删改为的基础上加上咱们本身的后台逻辑。
所以某种程度能够说他是不依赖于具体业务的。无论啥系统后台都是由表组成。

不依赖于后台逻辑,又能够加上逻辑。

user/models的注册

users/adminx.py中

# 建立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) 

此时后台页面。

 
mark

能够自行测试轮播图是否能够新建成功。

本小节结束对应commit:

usersmodels三张表注册进xadmin, 配置搜索过滤展现字段,修复xadmin导出xml错误,导出csv乱码,Unicode重载。对应5-3

py3(django2.0.1):

usersmodels三张表注册进xadmin, 配置搜索过滤展现字段,修复xadmin导出csv乱码,修复django2.0.1的indexError, str重载。对应5-3

原文学习来自简书,做者:天涯明月笙连接:https://www.jianshu.com/p/16d4dd0093d7

相关文章
相关标签/搜索