美文网首页程序员
xadmin后台管理(三)

xadmin后台管理(三)

作者: Zhang_derek | 来源:发表于2018-06-13 00:33 被阅读14次

    xadmin的安装

    django2.0的安装(源码安装方式):
    下载地址:https://github.com/sshwsfc/xadmin/tree/django2
    把zip文件放到pip目录下,运行下面命令安装:

    pip install -i https://pypi.douban.com/simple xadmin-django2
    

    安装成功后,同时也安装了很多依赖的包。

    xadmin的设置

    (1)新建Python Package "extra_apps",把源码xadmin文件夹放到extra_apps文件夹下面,此时目录结构如下:

    image

    (2)把extra_apps右键mark为Source Root并在settings中加入

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

    (3)因为我们用源码的xadmin,所以要卸载之前安装的

    pip uninstall xadmin
    

    (4)配置路由

    把admin改成xadmin

    # urls.py
    
    from django.urls import path
    
    import xadmin
    
    urlpatterns = [
        path('xadmin/', xadmin.site.urls),
    ]
    

    (5)注册app

    把下面两个app注册到settings.py的INSTALLED_APPS中

    'xadmin',
    'crispy_forms'
    

    (6)重新生成数据库

    python manage.py makemigrations
    
    python manage.py migrate
    

    (7)设置成中文

    LANGUAGE_CODE = 'zh-hans'
    
    TIME_ZONE = 'Asia/Shanghai'
    
    USE_I18N = True
    
    USE_L10N = True
    
    USE_TZ = False
    

    (8)创建一个管理员用户

    python manage.py createsuperuser
    

    现在就可以运行了

    python manage.py runserver 
    

    访问后台:http://127.0.0.1:8000/xadmin

    可以看到成功进入管理界面

    image

    datetimefield报错问题解决:

    image.png

    当我们点增加用户信息,会报错

    [图片上传失败...(image-e0167-1528813192449)]

    可以看到报的是xadmin/widgets中第80行

     def render(self, name, value, attrs=None):
            input_html = [ht for ht in super(AdminSplitDateTime, self).render(name, value, attrs).split('\n') if ht != '']
            # return input_html
            return mark_safe('<div class="datetime clearfix"><div class="input-group date bootstrap-datepicker"><span class="input-group-addon"><i class="fa fa-calendar"></i></span>%s'
                             '<span class="input-group-btn"><button class="btn btn-default" type="button">%s</button></span></div>'
                             '<div class="input-group time bootstrap-clockpicker"><span class="input-group-addon"><i class="fa fa-clock-o">'
                             '</i></span>%s<span class="input-group-btn"><button class="btn btn-default" type="button">%s</button></span></div></div>' % (input_html[0], _(u'Today'), input_html[1], _(u'Now')))
    

    上面贴出来的最后一行代码就是widgets.py的第80行代码。

    可以看出这句代码是希望用“\n”把input_html里的两个标签拆开,但两个标签之间没有换行,所以没能拆分,导致报错。

    input_html[1]就是报错的代码,因为input_html里只有一个元素。

    解决办法:

    既然“\n”不能拆分标签,那么就换一种拆分方式,使用“/><”拆分。

    原代码:

    input_html = [ht for ht in super(AdminSplitDateTime, self).render(name, value, attrs).split('\n') if ht != '']
    

    修改后代码:

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

    再运行就正常了

    users app的models注册

    (1)在users下面创建adminx.py,代码如下:

    # users/adminx.py
    
    import xadmin
    
    from .models import EmailVerifyRecord
    
    #xadmin中这里是继承object,不再是继承admin
    class EmailVerifyRecordAdmin(object):
        pass
    
    xadmin.site.register(EmailVerifyRecord,EmailVerifyRecordAdmin)
    

    (2)完善功能,增加显示字段,搜索和过滤

    修改users/adminx.py,代码如下:

    # users/adminx.py
    
    import xadmin
    
    from .models import EmailVerifyRecord
    
    #xadmin中这里是继承object,不再是继承admin
    class EmailVerifyRecordAdmin(object):
        # 显示的列
        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)
    
    image.png

    users中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']
    
    
    xadmin.site.register(Banner,BannerAdmin)
    

    剩余app model注册

    (1)course

    代码如下: 注意外键

    # course/adminx.py
    
    import xadmin
    
    from .models import Course, Lesson, Video, CourseResource
    
    
    class CourseAdmin(object):
        '''课程'''
        
        list_display = [ 'name','desc','detail','degree','learn_times','students']
        search_fields = ['name', 'desc', 'detail', 'degree', 'students']
        list_filter = [ 'name','desc','detail','degree','learn_times','students']
        
    
    class LessonAdmin(object):
        '''章节'''
        
        list_display = ['course', 'name', 'add_time']
        search_fields = ['course', 'name']
        #这里course__name是根据课程名称过滤
        list_filter = ['course__name', 'name', 'add_time']
    
    
    class VideoAdmin(object):
        '''视频'''
        
        list_display = ['lesson', 'name', 'add_time']
        search_fields = ['lesson', 'name']
        list_filter = ['lesson', 'name', 'add_time']
    
    
    class CourseResourceAdmin(object):
        '''课程资源'''
        
        list_display = ['course', 'name', 'download', 'add_time']
        search_fields = ['course', 'name', 'download']
        list_filter = ['course__name', 'name', 'download', 'add_time']
    
    
    # 将管理器与model进行注册关联
    xadmin.site.register(Course, CourseAdmin)
    xadmin.site.register(Lesson, LessonAdmin)
    xadmin.site.register(Video, VideoAdmin)
    xadmin.site.register(CourseResource, CourseResourceAdmin)
    

    (2)organizations

    代码如下:

    # organization/adminx.py
    
    import xadmin
    
    from .models import CityDict, CourseOrg, Teacher
    
    
    
    class CityDictAdmin(object):
        '''城市'''
        
        list_display = ['name', 'desc', 'add_time']
        search_fields = ['name', 'desc']
        list_filter = ['name', 'desc', 'add_time']
    
    
    class CourseOrgAdmin(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']
    
    
    class TeacherAdmin(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

    代码如下:

    # operation/adminx.py
    
    import xadmin
    
    from .models import UserAsk, UserCourse, UserMessage, CourseComments, UserFavorite
    
    
    class UserAskAdmin(object):
        '''用户表单我要学习'''
    
        list_display = ['name', 'mobile', 'course_name', 'add_time']
        search_fields = ['name', 'mobile', 'course_name']
        list_filter = ['name', 'mobile', 'course_name', 'add_time']
    
    
    #
    class UserCourseAdmin(object):
        '''用户课程学习'''
    
        list_display = ['user', 'course', 'add_time']
        search_fields = ['user', 'course']
        list_filter = ['user', 'course', 'add_time']
    
    
    
    class UserMessageAdmin(object):
        '''用户消息后台'''
    
        list_display = ['user', 'message', 'has_read', 'add_time']
        search_fields = ['user', 'message', 'has_read']
        list_filter = ['user', 'message', 'has_read', 'add_time']
    
    
    
    class CourseCommentsAdmin(object):
        '''用户评论后台'''
    
        list_display = ['user', 'course', 'comments', 'add_time']
        search_fields = ['user', 'course', 'comments']
        list_filter = ['user', 'course', 'comments', 'add_time']
    
    
    
    class UserFavoriteAdmin(object):
        '''用户收藏后台'''
    
        list_display = ['user', 'fav_id', 'fav_type', 'add_time']
        search_fields = ['user', 'fav_id', 'fav_type']
        list_filter = ['user', 'fav_id', 'fav_type', 'add_time']
    
    
    # 将后台管理器与models进行关联注册。
    xadmin.site.register(UserAsk, UserAskAdmin)
    xadmin.site.register(UserCourse, UserCourseAdmin)
    xadmin.site.register(UserMessage, UserMessageAdmin)
    xadmin.site.register(CourseComments, CourseCommentsAdmin)
    xadmin.site.register(UserFavorite, UserFavoriteAdmin)
    

    此时项目目录结构:

    image

    运行项目,进后台管理界面如下:

    image

    xadmin的全局配置

    将全局配置修改:

    • 如左上角:django Xadmin。下面的我的公司
    • 主题修改,app名称汉化,菜单收叠。
    • 使用Xadmin的主题功能。

    把全站的配置放在users\adminx.py中:

    (1)添加主题功能

    from xadmin import views
    
    # 创建xadmin的最基本管理器配置,并与view绑定
    class BaseSetting(object):
        # 开启主题功能
        enable_themes = True
        use_bootswatch = True
    
    # 将基本配置管理与view绑定
    xadmin.site.register(views.BaseAdminView,BaseSetting)
    

    没添加主题前,右上角界面

    image

    添加主题后,可以选择自己喜欢的主题

    image

    (2)全局配置

    修改django admin 和下面的我的公司收起菜单

    # 全局修改,固定写法
    class GlobalSettings(object):
        # 修改title
        site_title = 'NBA后台管理界面'
        # 修改footer
        site_footer = '科比的公司'
        # 收起菜单
        menu_style = 'accordion'
    
    # 将title和footer信息进行注册
    xadmin.site.register(views.CommAdminView,GlobalSettings)
    

    再进后台的界面,如下:

    image

    (3)修改app的名字

    在apps.py里面配置app的显示名称

    以users/apps.py为例,其它三个同样操作

    默认apps.py里面的代码

    from django.apps import AppConfig
    
    
    class UsersConfig(AppConfig):
        name = 'users'
    

    修改后:

    from django.apps import AppConfig
    
    
    class UsersConfig(AppConfig):
        name = 'users'
        verbose_name = '用户'
    

    还要在users/init.py中引用apps.py的配置

    添加代码如下:

    # users/__init__.py
    
    default_app_config = 'users.apps.UsersConfig'
    

    其它三个app也同样方法改成显示中文

    大功告成

    image

    相关文章

      网友评论

        本文标题:xadmin后台管理(三)

        本文链接:https://www.haomeiwen.com/subject/etfdeftx.html