django+xadmin在线教育平台(九)
django admin介绍
上一章我们进行了需求分析和数据库设计。本章我们来快速搭建一个可用的后台管理系统。
后台管理系统特点:
- 权限管理
- 少前端样式。(样式一般不是很看重),
- 快速开发
django的后台管理系统是一套智能的管理系统。
django的杀手锏之一就是admin管理系统。
admin在项目新建时就已经为我们生成好了。
Django的admin也是一个app,在我们新建项目时就创建好了。
而且会自动在url中配置好了链接。
访问:http://127.0.0.1:8000/admin/
可以看到admin的登录窗口。
Django是不会自动生成admin的用户的,需要我们自己去命令生成。
createsuperuser
点击Tools 菜单下 Run manage.py Task
createsuperuser
输入自己的用户名密码。
报错:
django.db.utils.DataError: (1406, "Data too long for column 'gender' at row 1")
gender中female是6位。而我们最大长度只有5.
修改后
makemigrations users
migrate users
然后重新createsuperuser
使用自己定义的用户名密码可以登进系统。
默认是用户名 + 密码。后面会讲到如何实现用户名 或 邮箱和密码登录。
修改setting中对应语言,时区,以及数据库写入时间。
修改
# 语言改为中文
LANGUAGE_CODE = 'zh-hans'
# 时区改为上海
TIME_ZONE = 'Asia/Shanghai'
# 数据库存储使用时间,True时间会被存为UTC的时间
USE_TZ = False
点击运行可以看到如下图被换成汉语的效果:
注意: 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)
可以看到我们的用户信息就注册进来了。
USERS
是用户所在表名称。
进入页面可以看到Django为我们把每个不同类型的字段生成了不同的前端样式。
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;",
}
},
}
实验成功为了不影响后面,把options删除
本小节结束对应commit:
admin中添加管理器&注册。时区,语言,utc(False).数据库中选项参数。female的长度修改, createsuperuser.对应5-1
xadmin的安装
一套基于admin, 比admin更强大的系统。
- 通过pip安装
pip install xadmin
Python3 & Django2.0.1安装官方适配Django2.0的包
pip install git+git://github.com/sshwsfc/xadmin.git@django2
xadmin可以把我们的后台做的很强大,可扩展。
可以看到它同时下载了很多其他依赖包。
注册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
可以看到已经被应用成功。
前往Navicat进行验证。
可以看到新增的表。
Xadmin的后台采用的是bootstrap。
后面我们会介绍如何制作插件
源码安装:
github: https://github.com/sshwsfc/xadmin
下载或git clone
将源码下载到本地。
解压后将Xadmin文件夹复制到我们的项目中。
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
此时又可以成功运行了
日志记录:后台管理人员做的操作都会生成一条记录。
源码安装优点:
- xadmin新特性
- 对于源码进行自己的修改。
本小节结束对应commit:
Xadmin的安装与源码安装,配置setting中extra_apps. 对应5-2
users app 的model注册
遗留问题: django2.0.1使用xadmin时。如验证码等带dateTimefield区域出错。
xadmin/widgets.py
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]
此时可以看到已经运行正常
真正开始
Xadmin是基于Django的admin来开发的,所以Xadmin也继承了许多admin的用法。
- 比如: models的注册。
UserProfile已经被自动注册进去了,我们从验证码开始注册。
我们需要新建一个adminx.py
文件,Xadmin会自动搜寻这种命名的文件。
新建py文件的初始化模板
新建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)
可以看到这时候访问已经有邮箱验证码了。
邮箱验证码这几个字就是我们代码中Meta中verbose_name定义的:
class Meta:
verbose_name = "邮箱验证码"
verbose_name_plural = verbose_name
verbose_name_plural
是verbose_name
的复数形式。
字段的verbose_name会直接显示在后台。sendtype
和sendtime
没有设置所以直接显示了英文。
可以看到我们添加验证码成功。注意:上节版本中我们进行了: makemigaration & migrate。
但是它是pip安装的Xadmin的数据表生成。我们卸载之后,源码安装需要重新运行进行数据迁移。(django需要通过app文件夹下的init文件来记录表的更改记录,pip的都卸了,所以就没法找到了)
会报错:
Xadmin_log不存在错误。只需要运行这两条命令即可。
解决后台部分英文显示
全部models中字段自行添加verbose_name
这里就不贴出来了,自行检查都加上(没写出的请自行修改全部加上verbose_name)。
解决EmailVerifyRecord object显示
全部(没写出的请自行修改)model,py2:重载
__unicode
py3:重载__str__
# 重载Unicode方法使后台不再直接显示object
def __unicode__(self):
return '{0}({1})'.format(self.code,self.email)
上面代码是python的自身基础语法。
配置显示列
users/adminx.py的管理器中设置list_display:
# 创建admin的管理类,这里不再是继承admin,而是继承object
class EmailVerifyRecordAdmin(object):
# 配置后台我们需要显示的列
list_display = ['code', 'email','send_type', 'send_time']
list_display可以使用列表或元祖,建议使用列表。否则元组只有一个元素,忘记加逗号就会报错。
选择框的生成是因为我们加上了choices
配置搜索searchfield
users/adminx.py的管理器中EmailVerifyRecordAdmin添加
# 配置搜索字段,不做时间搜索
search_fields = ['code', 'email','send_type']
再添加一条数据验证搜索功能
xadmin导出csv中文乱码解决
将
charset=utf-8
改为charset=gbk
xadmin导出xml报错
TypeError at /xadmin/users/emailverifyrecord/
unicode argument expected, got 'str'
io.StringIO这个库新版本的python3直接往这个库中加入了一些新的内容,使得该库在Python2.7中较为混乱。
将StringIo变为BytesIO
通过时间筛选字段。
users/adminx.py的管理器中EmailVerifyRecordAdmin添加
# 配置筛选字段
list_filter = ['code', 'email','send_type', 'send_time']
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)
此时后台页面。
可以自行测试轮播图是否可以新建成功。
本小节结束对应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
django+xadmin在线教育平台(九)的更多相关文章
- django+xadmin在线教育平台(一)
大家好,此教程为在慕学网的实战教程Python升级3.6 强力Django+杀手级Xadmin打造在线教育平台的学习笔记,不对望指正! 使用Django+Xadmin打造在线教育平台(Python2, ...
- django+xadmin在线教育平台(五)
3-3 django orm介绍与model设计 上节教程完成后代码(来学习本节前置条件): 对应commit: 留言板前端页面展示.本次内容截止教程3-2结束. 可能现在你还在通过手写sql语句来操 ...
- django+xadmin在线教育平台(四)
3-2 配置表单页面 必要的该说的,该了解的 前置条件: 你已经学习了前面教程.将项目的文件夹目录结构,setting配置等修改完毕与我保持一致. 本节通过Django快速的配置一个留言板页面来学习 ...
- django+xadmin在线教育平台(十)
剩余app model注册 courses注册 新建courses/adminx.py: # encoding: utf-8 __author__ = 'mtianyan' __date__ = '2 ...
- django+xadmin在线教育平台(六)
4-1 使用py3.6和django1.11开发系统前注意事项 直接通过Python3.6和django最新版本来开发我们的系统的一些注意事项. 原版本: Python 2.7 & djang ...
- django+xadmin在线教育平台(十七)
8-1 课程列表 拷贝课程列表页到template目录 创建课程相关的urls.py Mxonline2/urls.py中声明包含到course的url中: # 课程app的url配置 url(r&q ...
- django+xadmin在线教育平台(十六)
7-7 modelform 提交我要学习咨询1 对应表userask form会对字段先做验证,然后保存到数据库中. 可以看到我们的forms和我们的model中有很多内容是一样的.我们如何让代码重复 ...
- django+xadmin在线教育平台(十五)
7-4 课程机构列表页数据展示2 前去html中进行数据填充 mark 可以看到所有城市是通过a标签,当前选中城市为active. mark 之后把下面的写死的城市删除掉. mark 这时 ...
- django+xadmin在线教育平台(十四)
7-1 django templates模板继承1 机构可以筛选类别 机构可以根据所在地区进行分类 右侧我要学习功能: form表单提交 右下:授课机构排名 页面头部与底部为全局头和全局底部. Dja ...
随机推荐
- gdb调试汇总
1. 启动GDB开始调试: (1)gdb program ///最常用的用gdb启动程序,开始调试的方式(2)gdb program core ///用gdb查看core dump文件,跟踪程序cor ...
- 连接Mysql时出现java.math.BigInteger cannot be cast to java.lang.Long问题
今天遇见这样一个坑.在连接数据库进行查询数据时,大家可能会遇见这样一个问题:java.math.BigInteger cannot be cast to java.lang.Long,然后去检查代码中 ...
- 我的第一台 Mac
我的第一台 Mac 心里的这棵草长了一年多之后终于狠心剁手了. 2018年11月6号下单 2018 款 MBP 2.6/32/512 定制款,7号早上到手 --- 感受(个人主观感觉-)
- 关于jqeury中attr()和prop()方法
在平时工作中老会被一样的问题困住,浪费时间,这里做一个简要笔记. 在使用jquery给元素设置属性的时候,如果是一般的div,p等正常元素设置属性的话,使用attr()足以,但是在给拥有checked ...
- 好用的切换滑动焦点图框架jquery.superslide
拿到学习网站:http://www.superslide2.com/
- (13)JavaScript之[HTML DOM元素][JS对象]
元素 /** * HTML DOM 元素(节点)*/ //创建新的HTML元素 var para = document.createElement('p'); var node = document. ...
- (C# 基础) 类访问修饰符
C# 中有5个权限修饰符,用于控制对对象的访问权限. 1. public: 访问不受限制. namespace, enum成员,interface成员 隐式的具有public 修饰符,不能在显式添 ...
- APK加固之静态脱壳机编写入门
目录: 0x00APK加固简介与静态脱壳机的编写思路 1.大家都知道Android中的程序反编译比较简单,辛苦开发出一个APK轻易被人反编译了,所以现在就有很多APK加固的第三方平台,比如爱加密和梆梆 ...
- 初识ImageSwither
imageswitcher继承自viewswitcher,使用ImageSwither只需要两步: 1.为ImageSwither提供一个ViewFactory,该ViewFactory生成的View ...
- python3线程介绍02(线程锁的介绍:互斥、信号、条件、时间、定时器)
#!/usr/bin/env python# -*- coding:utf-8 -*- import threadingimport timeimport random # 1-互斥锁 Lock 同一 ...