最新Django2.0.1在线教育零基础到上线教程(五)1-3

演示地址: http://mxonline.mtianyan.cn

教程仓库地址1: https://github.com/mtianyan/DjangoGetStarted 教程仓库地址2: https://github.com/mtianyan/Mxonline2 教程仓库地址3: https://github.com/mtianyan/Mxonline3

django admin介绍

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

后台管理系统特点:

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

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

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

mark

Django的admin也是一个app,在我们新建项目时就创建好了。 而且会自动在url中配置好了链接。

mark

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

可以看到admin的登录窗口。

Django是不会自动生成admin的用户的,需要我们自己去命令生成。

createsuperuser

点击Tools 菜单下 Run manage.py Task

createsuperuser 

mark

输入自己的用户名密码。

报错:

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏北京马哥教育

Django 1.11官方教程翻译

一直以来由于英语废所以极端抵触看英文文档。感觉人还是要逼一下自己,所以就有了这篇翻译。如果有翻译错误的地方欢迎在评论中指正。 Let’s learn by e...

5946
来自专栏北京马哥教育

精通Linux常用的100+命令大全万字详解长文(珍藏版)

运维行业正在变革?推荐阅读:30万年薪Linux运维工程师成长魔法 Linux提供了大量的命令,利用它可以有效地完成大量的工作,如磁盘操作、文件存取、目录操作、...

52610
来自专栏何俊林

在线看Android系统源码,相见恨晚的几种方案

前言:最近在研究MediaCodec,u盘坏了,之前下载的源码也就自然没有了,真是个难过的事情,不能因为没有源码了,就阻挡我的计划了呀,于是就是今天一文,在线看...

5695
来自专栏七夜安全博客

小知识点--crontab

这两周学了很多东西,还把golang语言基本掌握了,收获还是挺多的。在做安全的过程中,有很多需要定时执行的任务,比如抓取主机数量,端口数据等,这都逃不开linu...

722
来自专栏张戈的专栏

WP Super Cache静态缓存插件纯代码版(兼容多域名网站)

中午,小熊发来一篇来自歧路亡羊博客的精彩教程:《wordpress 利用代码来实现缓存》。粗略看了一下,发现这个代码在几个月之前我就用过,不过由于此代码无法区分...

4917
来自专栏PHP在线

PHP 安全性漫谈

原文出处: 彭长霖 本文所讨论的安全性环境是在Linux+Apache+Mysql+PHP。超出此范围的安全性问题不在本文范畴之内 一、apache serv...

3557
来自专栏陈满iOS

iOS下载报错:App Transport Security has blocked a cleartext HTTP

以上方法虽然解决了HTTP不能正常使用的问题,但是苹果提供的安全保障也被关闭了,对于不支持HTTPS协议的网站,可以考虑白名单:

3864
来自专栏Linux驱动

27.Linux-DM9000C网卡移植(详解)

上一节 我们学习了:   网卡驱动介绍以及制作虚拟网卡驱动 接下来本节,学习网卡芯片DM9000C,如何编写移植DM9000C网卡驱动程序。 1.首先来看DM9...

2245
来自专栏c#开发者

消息队列(Message Queue)简介及其使用

消息队列(Message Queue)简介及其使用 利用 MSMQ(Microsoft Message Queue),应用程序开发人员可以通过发送和接收消息方...

4808
来自专栏开发与安全

进程控制块PCB结构 task_struct 描述

注:本分类下文章大多整理自《深入分析linux内核源代码》一书,另有参考其他一些资料如《linux内核完全剖析》、《linux c 编程一站式学习》等,只是为了...

2698

扫码关注云+社区

领取腾讯云代金券