Django+xadmin打造在线教育平台(二)曹明
是文件README.rst出现了Unicode解码错误,这个文件是没有什么用处的,可以新建一个同名的空白文件替换掉首先下载zip源码包:github.com/sshwsfc/xadmin解压后,打开README.rst文件,清空里面的内容,然后保存。再压缩成zip,放到pip目录下:C:\Users\Administrator\AppData\Local\Programs\Python\Python36\Lib\site-packages\pip此时打开cmd进行安装:pipinstallxadmin-master.zip如果上面安装提示错误:
更换安装源(使用豆瓣源)
安装xadmin的命令如下:
(1)新建PythonPackage"extra_apps",把源码xadmin文件夹放到extra_apps文件夹下面,此时目录结构如下:
(2)把extra_apps右键mark为SourceRoot并在settings中加入
pipuinstallxadmin(4)配置路由
把admin改成xadmin
#urls.pyfromdjango.urlsimportpathimportxadminurlpatterns=[path('xadmin/',xadmin.site.urls),](5)注册app
把下面两个app注册到settings.py的INSTALLED_APPS中
'xadmin','crispy_forms'(6)重新生成数据库
pythonmanage.pymakemigrationspythonmanage.pymigrate(7)设置成中文
LANGUAGE_CODE='zh-hans'TIME_ZONE='Asia/Shanghai'USE_I18N=TrueUSE_L10N=TrueUSE_TZ=False(8)创建一个管理员用户
pythonmanage.pycreatesuperuser现在就可以运行了
可以看到成功进入管理界面
datetimefield报错问题解决:
当我们点增加用户信息,会报错
可以看到报的是xadmin/widgets中第80行
defrender(self,name,value,attrs=None):input_html=[htforhtinsuper(AdminSplitDateTime,self).render(name,value,attrs).split('\n')ifht!='']#returninput_htmlreturnmark_safe('%s''%s
''
''%s%s '%(input_html[0],_(u'Today'),input_html[1],_(u'Now')))上面贴出来的最后一行代码就是widgets.py的第80行代码。
可以看出这句代码是希望用“\n”把input_html里的两个标签拆开,但两个标签之间没有换行,所以没能拆分,导致报错。
input_html[1]就是报错的代码,因为input_html里只有一个元素。
解决办法:
既然“\n”不能拆分标签,那么就换一种拆分方式,使用“/><”拆分。
原代码:
input_html=[htforhtinsuper(AdminSplitDateTime,self).render(name,value,attrs).split('\n')ifht!='']修改后代码:
input_html=[htforhtinsuper(AdminSplitDateTime,self).render(name,value,attrs).split('/><')ifht!='']input_html[0]=input_html[0]+"/>"input_html[1]="<"+input_html[1]再运行就正常了
(1)在users下面创建adminx.py,代码如下:
#users/adminx.pyimportxadminfrom.modelsimportEmailVerifyRecord#xadmin中这里是继承object,不再是继承adminclassEmailVerifyRecordAdmin(object):passxadmin.site.register(EmailVerifyRecord,EmailVerifyRecordAdmin)(2)完善功能,增加显示字段,搜索和过滤
修改users/adminx.py,代码如下:
users中Banner也注册进去
classBannerAdmin(object):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(Banner,BannerAdmin)3.4.剩余appmodel注册(1)course
代码如下:注意外键
代码如下:
#organization/adminx.pyimportxadminfrom.modelsimportCityDict,CourseOrg,TeacherclassCityDictAdmin(object):'''城市'''list_display=['name','desc','add_time']search_fields=['name','desc']list_filter=['name','desc','add_time']classCourseOrgAdmin(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']classTeacherAdmin(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)(3)operation
运行项目,进后台管理界面如下:
将全局配置修改:
使用Xadmin的主题功能。
把全站的配置放在users\adminx.py中:
(1)添加主题功能
fromxadminimportviews#创建xadmin的最基本管理器配置,并与view绑定classBaseSetting(object):#开启主题功能enable_themes=Trueuse_bootswatch=True#将基本配置管理与view绑定xadmin.site.register(views.BaseAdminView,BaseSetting)没添加主题前,右上角界面
添加主题后,可以选择自己喜欢的主题
(2)全局配置
修改djangoadmin和下面的我的公司收起菜单
(3)修改app的名字
在apps.py里面配置app的显示名称
以users/apps.py为例,其它三个同样操作
默认apps.py里面的代码
fromdjango.appsimportAppConfigclassUsersConfig(AppConfig):name='users'修改后:
fromdjango.appsimportAppConfigclassUsersConfig(AppConfig):name='users'verbose_name='用户'还要在users/__init__.py中引用apps.py的配置
添加代码如下:
#users/__init__.pydefault_app_config='users.apps.UsersConfig'其它三个app也同样方法改成显示中文
大功告成
(1)把html文件中index.html拷贝到templates文件夹内
(2)新建static目录用来存放静态文件
在settings.py中设置路径
使用ctrl+f查找出所有“../”,然后ctrl+r全部替换为“/static/”
(4)配置静态文件的url
MxOnline/urls.py中
把login.html拷贝到templates文件夹下
配置login的url
原始样子
(1)修改login的路由
fromdjango.views.genericimportTemplateViewfromusersimportviewsurlpatterns=[path('xadmin/',xadmin.site.urls),path('',TemplateView.as_view(template_name='index.html'),name='index'),path('login/',views.user_login,name='login'),#修改login路由](2)写login的视图
原始index.html的代码
更改代码如下:
这里是继承ModelBackend类来做的验证
(1)把前面views中的user_login()函数改成基于类的形式
fromusers.viewsimportLoginViewpath('login/',LoginView.as_view(),name='login'),