Django-Xadmin

“我们只能延缓那一日,但不能改变那结局。因为命运,本就是因为它无法被改变,所以才称之为命运。”他顿了顿,“而现在,你要改变命运了幺?”

安装

常规的安装使用pip

pip3 install django-xadmin

然而发现报错

UnicodeDecodeError: 'gbk' codec can't decode byte 0xa4 in position 3256: illegal multibyte sequence

原因是编码错误,换个方式

pip3 install git+git://github.com/sshwsfc/xadmin.git@django2

我的电脑发现还是不行,只好直接把GIthub的源码下载下来

https://github.com/sshwsfc/xadmin/tree/django2

然后编辑里面的requirement.txt

django-crispy-forms==1.6.0
django-import-export==0.5.1
django-reversion==2.0.0
django-formtools==2.1
future==0.15.2
httplib2==0.9.2
six==1.10.0

先执行命令

pip3 install -r requirement.txt

注意 django-formtools 这个库的版本号需要为2.1 ,不然会报错

然后执行命令

python3 setup.py install

为了让xadmin拥有导出excel的功能,还需要安装两个库

pip3 install xlwt
pip3 install xlsxwriter

安装成功.

为了方便,我把xadmin2.0安装包压缩后保存在服务器,方便备份下载Download_Ulr

配置

随便创建一个项目,修改其中的settings.py和urls.py即可完成配置

# settings.py
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'xadmin',
    'crispy_forms',
    'reversion',
]

LANGUAGE_CODE = 'zh-hans'

TIME_ZONE = 'Asia/Shanghai'

# urls.py
from django.contrib import admin
from django.urls import path
import xadmin

urlpatterns = [
    path('admin/', admin.site.urls),
    path('xadmin/', xadmin.site.urls)
]

然后执行命令创建数据库创建管理员用户即可

使用命令为下面三行

python3 manage.py migrate
python3 manage.py createsuperuser
python3 manage.py runserver

然后访问

http://127.0.0.1:8000/xadmin

即可

很漂亮哦

使用

首先新建一个应用

python3 manage.py startapp app

然后别忘了在settings.py中INSTALLER_APPS添加你的引用

定制顶部标题

# app/admin.py
from xadmin import views

class GlobalSetting(object):
    # 设置后台顶部标题
    site_title ='修改顶部标签成功~~'
    # 设置后台底部标题
    site_footer ='记得双击么么哒'
    # menu_style = "accordion"
    # # 设置左侧菜单可折叠
xadmin.site.register(views.CommAdminView, GlobalSetting)

class BaseSetting(object):
     """主题配置"""
     enable_themes = True
     use_bootswatch = True
xadmin.site.register(views.BaseAdminView, BaseSetting)

查看后台,可以看到标题被修改

数据关联到后台

# app/models.py
# coding:utf-8
from django.db import models

class UserInfo(models.Model):
    username = models.CharField(max_length=20,verbose_name='用户名')
    password = models.CharField(max_length=30,verbose_name='密码')
    datetime = models.DateField(auto_now_add=True,verbose_name='注册时间')

    class Meta:
        db_table = 'UserInfo'
        verbose_name = "用户信息"
        verbose_name_plural = verbose_name

class Data(models.Model):
    id = models.AutoField(primary_key=True)
    data = models.TextField()
    class Meta:
        db_table = 'Show_Data'
        verbose_name = '数据展示'
        verbose_name_plural = verbose_name

然后继续修改文件

# app/admin.py
# coding:utf-8

from xadmin import views
import xadmin
from .models import UserInfo,Data

class Show_UserInfo(object):
    """设置显示字段"""
    #  list_display 设置显示的字段
    # list_filter  设置过滤的字段 外键 使用 '__'  比如 user__id 一般用于多数据过滤
    # search_fields 设置搜索的字段,搜索框使用的模糊查询,一般用于唯一值查找
    # free_query_fields 默认是Ture 指定是否能自由搜索 也就是使用url来搜索
    # data_charts 图表功能

    list_display = ['username','password','datetime']
    data_charts = {
        "user_count": {'title': u"用户报表", "x-field": "datetime", "y-field": ("username",),
                       "order": ('datetime',)},
        "avg_count": {'title': u"密码报表", "x-field": "datetime", "y-field": ('password',),
                      "order": ('datetime',)}
    }

    # title : 图表的显示名称
    # x-field : 图表的 X 轴数据列, 一般是日期, 时间等
    # y-field : 图表的 Y 轴数据列, 该项是一个list, 可以同时设定多个列, 这样多个列的数据会在同一个图表中显示
    # order : 排序信息, 如果不写则使用数据列表的排序
xadmin.site.register(UserInfo,Show_UserInfo)


class Show_Data(object):
    list_display = ['id','data']
xadmin.site.register(Data,Show_Data)

查看后台,可以看到数据被关联

还可以看到有导出哦~

修改项目显示

创建的项目名为app,显示的也是app,修改方式如下

# app/app.py
# coding:utf-8
from django.apps import AppConfig


class AppConfig(AppConfig):
    name = 'app'
    verbose_name = "用户管理"

然后修改同目录下init文件

# app/__init__.py
default_app_config ='app.apps.AppConfig'

然后可以看到显示为中文

设置图标

使用如下方式对可以添加图标

# app/admin.py
class Show_Data(object):
    list_display = ['id','data']
    model_icon = 'fa fa-home'
    # 添加这一行,可以显示图标,
    # 查看更多图标访问 http://fontawesome.dashgame.com/
    # https://v3.bootcss.com/components/
    # http://www.yeahzan.com/fa/facss.html
xadmin.site.register(Data,Show_Data)

注意这里添加图标,对应的对象必须是数据库的模型

xadmin使用的导航图标采用font-awesome图标,你可以到

http://fontawesome.dashgame.com

下载最新的图标文件,并解压出css和font目录

把css和font目录这两个文件拷贝并覆盖到xadmin的目录中,具体xadmin的目录路径如下:

C:\python3\Lib\site-packages\xadmin-2.0.1-py3.6.egg\xadmin\static\xadmin

设置搜索

class postsAdmin(object):
    list_display = ["navi_f", "navi_s", "author", "title",  "add_time", "is_recommend", "is_essence", "is_auth", "is_approval", "is_commit"]  # 指定展示的字段
    inField = "forum"  # 用于分组
    is_execute = True  # 是否启用自定义插件,二级联动查询
    list_filter = ["is_auth","is_recommend", "is_essence","navi_f", "navi_s", "author", "is_approval"]  # 过滤字段
    search_fields = ["title"]  # 搜索字段
    list_editable = ["is_approval"]  # 可编辑字段

    actions = ["linkage_filter",]  # 自定义插件

设置书签

list_bookmarks = [{
    'title': "京东数据",  # 书签的名称, 显示在书签菜单中
    'query': {'BA_name__contains': '京东'},  # 过滤参数, 是标准的 queryset 过滤
    'order': ("uid"),  # 排序参数
    'cols': ("url",'BA_id','BA_sex','BA_name','counts','change_time'),  # 显示的列
}]

指定参数

list_display=[] #要显示的字段
search_fields=[] #搜索的字段
list_filter = [] #过滤器
date_hierarchy =['publication_date']  #添加过滤(这里是过滤日期)
ordering = ['-publication_date',]   #排序(这里以日期排序,加‘-’表示降序)
filter_horizontal = ('authors',) #filter_horizontal 从‘多选框’的形式改变为‘过滤器’的方式,水平排列过滤器,必须是一个 ManyToManyField类型,且不能用于 ForeignKey字段,默认地,管理工具使用`` 下拉框`` 来展现`` 外键`` 字段
filter_vertical = ['authors',]#同上filter_horizontal,垂直排列过滤器
raw_id_fields = ['publisher',] #将ForeignKey字段从‘下拉框’改变为‘文本框’显示
list_editable = ['csdevice'] #在列表页可直接编辑的字段
model_icon = 'fa fa-user-secret'  #图标样式
style_fields = {'csdevice': 'm2m_transfer','csservice': 'ueditor',} #字段显示样式
refresh_times = [10, 60] #自动刷新时间
show_detail_fields=['ttdsn'] #在指定的字段后添加一个显示数据详情的一个按钮
relfield_style = 'fk-ajax' #涉及到外键下拉的时候使用ajax搜索的方式而不是全部列出的方式,比如在分类下拉很多的情况下,这个功能就很好用
free_query_filter=['字段1','字段2',......]#默认为 True , 指定是否可以自由搜索. 如果开启自由搜索, 用户可以通过 url 参数来进行特定的搜索
exclude=['字段1','字段2',......]#隐藏字段
aggregate_fields = {"expire": "max"}#  列聚合,在list表格下面会增加一行统计的数据,可用的值:"count","min","max","avg",  "sum"
# 添加数据时候,一步一步提供数据,分块显示
wizard_form_list = [
        ("基础信息", ("name", "contact", "telphone", "address")),
        ("其它信息", ("customer_id", "expire", "description")),
    ]
grid_layouts = ("table", "thumbnails") #列表的布局方式,是以表格一行一条的方式还是类似于缩略图的方式展示的
list_per_page = 50 # 每页显示数据的条数
list_max_show_all = 200 #每页最大显示数据的条数

错误处理

如果出现错误:

ModuleNotFoundError: No module named 'django.contrib.formtools'

依次执行命令:

pip3 uninstall django-formtools
pip3 install django-formtools==2.1

如果出现

AttributeError: 'Settings' object has no attribute 'MIDDLEWARE_CLASSES'

if settings.LANGUAGES and ‘django.middleware.locale.LocaleMiddleware’ in settings.MIDDLEWARE_ClASSES:

修改成

if settings.LANGUAGES and 'django.middleware.locale.LocaleMiddleware' in settings.MIDDLEWARE:

如果出现

ImportError: cannot import name 'QUERY_TERMS'

from django.db.models.sql.query import LOOKUP_SEP, QUERY_TERMS

修改成

from django.db.models.sql.query import LOOKUP_SEP
from django.db.models.sql.constants import QUERY_TERMS

如果出现

forms.Field.__init__(self, required, widget, label, initial, help_text, *args, **kwargs)
TypeError: __init__() takes 1 positional argument but 6 were given

forms.Field.__init__(self, required, widget, label, initial, help_text, *args, **kwargs) 

修改成

forms.Field.__init__(self)

如果出现

from django.core.urlresolvers import NoReverseMatch, reverse
ModuleNotFoundError: No module named 'django.core.urlresolvers'

需要修改源码

lib\site-packages\xadmin-0.6.1-py3.6.egg\xadmin\models.py 文件

from django.core.urlresolvers import NoReverseMatch, reverse 

修改为

from django.urls import NoReverseMatch, reverse

如果出现

TypeError: __init__() missing 1 required positional argument: 'on_delete'

content_type = models.ForeignKey(ContentType)

修改为

content_type = models.ForeignKey(ContentType,on_delete=models.CASCADE)

参考文献 1

参考文献 2

参考文献 3

参考文献 4

参考文献 5

坚持原创技术分享,您的支持将鼓励我继续创作!
------ 本文结束 ------

版权声明

LangZi_Blog's by Jy Xie is licensed under a Creative Commons BY-NC-ND 4.0 International License
由浪子LangZi创作并维护的Langzi_Blog's博客采用创作共用保留署名-非商业-禁止演绎4.0国际许可证
本文首发于Langzi_Blog's 博客( http://langzi.fun ),版权所有,侵权必究。

0%