xadmin需要新建一个 adminx.py 文件(默认Django自动生成了admin.py文件)
直接在apps/users目录下新建,xadmin会自动搜索我们每个app应用下面的adminx.py文件
我们要将models注册到adminx当中时需要在adminx中新建类(这里要注意这里和原生admin不同,我们继承的是object顶层)
# -*- coding:utf-8 -*-
__author__ = '玖河网络'
__date__ = '2018/7/17 14:55'
import xadmin
from .models import EmailVerifyRecord
class EmailVerifyRecordAdmin(object):
"""将邮箱验证注册到xadmin后台中"""
pass
xadmin.site.register(EmailVerifyRecord,EmailVerifyRecordAdmin)
这样就完成了我们EmailVerifyRecord这张表的注册
xadmin智能后台管理会自动将各个类型的表做了相应的界面,实际上xadmin只是将每个表做了增删改查的作用而已,但是我们可以在增删改查中自己制作逻辑。
注册后的页面没有具体显示字段,所以我们还需要设置字段:
我们测试添加邮箱可能会遇到的错误:
ProgrammingError at /xadmin/users/emailverifyrecord/add/
(1146, "Table 'mxonline.xadmin_log' doesn't exist")
Request Method: POST
Request URL: http://192.168.88.129:8000/xadmin/users/emailverifyrecord/add/
Django Version: 1.9.8
Exception Type: ProgrammingError
Exception Value:
(1146, "Table 'mxonline.xadmin_log' doesn't exist")
Exception Location: C:\Users\Administrator\Envs\mxonline\lib\site-packages\MySQLdb\connections.py in defaulterrorhandler, line 36
Python Executable: C:\Users\Administrator\Envs\mxonline\Scripts\python.exe
Python Version: 2.7.15
Python Path:
['C:\\Users\\Administrator\\PycharmProjects\\MxOnline\\apps',
'C:\\Users\\Administrator\\PycharmProjects\\MxOnline',
'C:\\Users\\Administrator\\PycharmProjects\\MxOnline',
'C:\\Users\\Administrator\\PycharmProjects\\MxOnline\\extra_apps',
'C:\\Users\\Administrator\\PycharmProjects\\MxOnline\\apps',
'C:\\Windows\\system32\\python27.zip',
'C:\\Users\\Administrator\\Envs\\mxonline\\DLLs',
'C:\\Users\\Administrator\\Envs\\mxonline\\lib',
'C:\\Users\\Administrator\\Envs\\mxonline\\lib\\plat-win',
'C:\\Users\\Administrator\\Envs\\mxonline\\lib\\lib-tk',
'C:\\Users\\Administrator\\Envs\\mxonline\\Scripts',
'c:\\python27\\Lib',
'c:\\python27\\DLLs',
'c:\\python27\\Lib\\lib-tk',
'C:\\Users\\Administrator\\Envs\\mxonline',
'C:\\Users\\Administrator\\Envs\\mxonline\\lib\\site-packages',
'C:\\Users\\Administrator\\Envs\\mxonline\\lib\\site-packages\\odf',
'C:\\Users\\Administrator\\Envs\\mxonline\\lib\\site-packages\\odf',
'C:\\Users\\Administrator\\Envs\\mxonline\\lib\\site-packages\\odf',
'C:\\Users\\Administrator\\Envs\\mxonline\\lib\\site-packages\\odf',
'C:\\Users\\Administrator\\Envs\\mxonline\\lib\\site-packages\\odf',
'C:\\Users\\Administrator\\Envs\\mxonline\\lib\\site-packages\\odf',
'C:\\Users\\Administrator\\Envs\\mxonline\\lib\\site-packages\\odf']
Server time: 星期二, 17 七月 2018 15:09:15 +0800
(原因:因为刚开始我们是用pip安装pipy上面的包,而现在我们用的是源码包是新的,所以pip安装的还没有创建依赖表)
解决方法:
pycharm 菜单栏 >>> Tools >>> Run manage.py Task >>>
manage.py@MxOnline> makemigrations xadmin [appname] (检测表)
manage.py@MxOnline> migrate xadmin [appname]
提交后我们发现并不能显示注册的邮箱名,而是类名称,所以我们还需要重载一下unicode
class EmailVerifyRecord(models.Model):
"""邮箱验证相关"""
code = models.CharField(max_length=20,verbose_name=u"验证码")
email = models.CharField(max_length=50,verbose_name=u"邮箱")
# 以上两项都不能为空
send_type = models.CharField(choices=(("register",u"注册"),("forget",u"找回密码")),max_length=10,verbose_name=u"验证类型")
# send_type 注册和找回密码时需要用到的
send_time = models.DateField(default=datetime.now,verbose_name=u"发送时间")
# 获取当前时间,datetime.now去掉后面的括号表示以实例化的时间来获取
class Meta:
verbose_name = u"邮箱验证码"
verbose_name_plural = verbose_name
#下面是重载unicode的方法
def __unicode__(self):
return '{0}({1})'.format(self.code,self.email)
正常显示(但是这样还不够,这里只显示了邮箱验证码,所以我们还需要在列表也中显示字段):
adminx.py的类中加入代码:
# -*- coding:utf-8 -*-
__author__ = '玖河网络'
__date__ = '2018/7/17 14:55'
import xadmin
from .models import EmailVerifyRecord
class EmailVerifyRecordAdmin(object):
"""将邮箱验证注册到xadmin后台中"""
list_display = ['code', 'email', 'send_type', 'send_time']
xadmin.site.register(EmailVerifyRecord,EmailVerifyRecordAdmin)
这样就能正常的显示出列表形式了。
另外我们还需要做查询,这里我们在类下面加入另外一个变量 search_fields
# -*- coding:utf-8 -*-
__author__ = '玖河网络'
__date__ = '2018/7/17 14:55'
import xadmin
from .models import EmailVerifyRecord
class EmailVerifyRecordAdmin(object):
"""将邮箱验证注册到xadmin后台中"""
list_display = ['code', 'email', 'send_type', 'send_time'] # 显示
search_fields = ['code', 'email', 'send_type'] # 搜索
xadmin.site.register(EmailVerifyRecord,EmailVerifyRecordAdmin)
时间筛选字段变量 list_filter
# -*- coding:utf-8 -*-
__author__ = '玖河网络'
__date__ = '2018/7/17 14:55'
import xadmin
from .models import EmailVerifyRecord
class EmailVerifyRecordAdmin(object):
"""将邮箱验证注册到xadmin后台中"""
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)
加入后我们又多了个筛选字段。
下面我们继续绑定更多的表到后台
# -*- coding:utf-8 -*-
__author__ = '玖河网络'
__date__ = '2018/7/17 14:55'
import xadmin
from .models import EmailVerifyRecord,Banner
class EmailVerifyRecordAdmin(object):
"""将邮箱验证注册到xadmin后台中"""
list_display = ['code', 'email', 'send_type', 'send_time'] # 显示字段
search_fields = ['code', 'email', 'send_type'] # 搜索字段
list_filter = ['code', 'email', 'send_type', 'send_time'] # 筛选字段
class BannerAdmin(object):
"""轮播图绑定到xadmin后台中"""
list_display = ['title', 'image', 'url', 'index','add_time'] # 显示字段
search_fields = ['title', 'image', 'url', 'index'] # 搜索字段
list_filter = ['title', 'image', 'url', 'index','add_time'] # 筛选字段
xadmin.site.register(EmailVerifyRecord,EmailVerifyRecordAdmin) # 关联注册
xadmin.site.register(Banner,BannerAdmin) # 关联注册
其他app绑定注册后台数据表基本操作一样,只是要注意外键的使用
我们在添加章节时显示Course object是因为我们还没有重载unicode方法,需要在models.py的章节类表中添加
注意:这里重载的是课程的unicode而不是章节的unicode
class Course(models.Model):
"""用于存储课程学习的表"""
name = models.CharField(max_length=50,verbose_name=u"课程名")
desc = models.CharField(max_length=300,verbose_name=u"课程描述")
detail = models.TextField(verbose_name=u"课程详情")
# 这里因为我们要做富文本,所以不限制长度
degree = models.CharField(max_length=2,choices=(("cj","初级"),("zj","中级"),("gj","高级")),verbose_name=u"难度")
learn_times = models.IntegerField(default=0,verbose_name=u"学习时长(分钟)")
students = models.IntegerField(default=0,verbose_name=u"学习人数")
fav_nums = models.IntegerField(default=0,verbose_name=u"收藏人数")
image = models.ImageField(max_length=100,upload_to="courses/%Y/%m",verbose_name=u"封面图")
click_nums = models.IntegerField(default=0,verbose_name=u"点击数")
add_time = models.DateTimeField(default=datetime.now,verbose_name=u"添加时间")
class Meta:
verbose_name = u"课程"
verbose_name_plural = verbose_name
def __unicode__(self):
return self.name
# 当前实例
另外我们在做章节搜索的时候无法搜索到结果,是因为章节要搜索的是外键,所以我们要用__name(表示搜索外键的name字段)
class LessonAdmin(object):
"""章节"""
list_display = ['course', 'name', 'add_time'] # 显示字段
search_fields = ['course', 'name'] # 搜索字段
list_filter = ['course__name', 'name', 'add_time'] # 筛选字段 搜索外键的__name字段