zoukankan      html  css  js  c++  java
  • django集成django-xadmin

    django2.0 以上版本安装 xadmin

    1.xadmin的下载

    源码包下载地址:

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

    2.使用命令安装xadmin

    pip install 你下载的压缩包的位置

    不用解压,直接使用pip或者pip3 install 压缩包 路径进行安装

    安装完成后,因为xadmin有自己的模型管理类,需要迁移

    由于安装时xadmin已经执行过 makemigrations

    所以直接使用 migrate进行迁移就行了

    其他办法

    第一步安装xadmin-django2
    https://github.com/sshwsfc/xadmin/tree/django2 下载xadmin-django2文件
    python setup.py install
    安装依赖pip install -r requirements.txt
    第二步setting配置xadmin

    INSTALLED_APPS = [
    	'xadmin',  # 添加
    	'crispy_forms',  # 添加
    	'reversion',  # 添加(可选)
    ]

    第三步urls.py配置,xadmin替换admin

    1

    2

    3

    4

    5

    6

    7

    8

    from django.conf.urls import url

    from django.contrib import admin

    import xadmin

    urlpatterns = [

    # url(r'^admin/', admin.site.urls),

    url(r'^xadmin/', xadmin.site.urls),

    ]

    数据库同步

    1

    2

    python manage.py makemigrations

    python manage.py migrate

    • 访问首页

    源码安装部署
    下载:https://github.com/sshwsfc/xadmin
    解压xadmin-master.zip文件,将xadmin-master文件中xadmin目录复制到自己的django项目下

    xadmin注册

    已在models创建表EmailVerifyRecord

    1

    2

    3

    4

    5

    6

    7

    8

    9

    class EmailVerifyRecord(models.Model):

    email_choices = (

    ('register', u'注册'),

    ('forget', u'找回密码'),

    )

    code = models.CharField(max_length=20, verbose_name=u'验证码')

    email = models.EmailField(max_length=50, verbose_name=u'邮箱')

    send_type = models.CharField(choices=email_choices, max_length=10, verbose_name=u'验证码类型')

    send_time = models.DateTimeField(default=datetime.now, verbose_name=u'发送时间')

    在创建的app下创建adminx.py文件

    1

    2

    3

    4

    5

    6

    7

    8

    9

    import xadmin

    from .models import EmailVerifyRecord

    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)

    主题应用

    adminx.py文件增加

    1

    2

    3

    4

    5

    6

    7

    from xadmin import views

    class BaseSetting(object):

    enable_themes = True

    use_bootswatch = True

    xadmin.site.register(views.BaseAdminView, BaseSetting)

    全局应用

    • 页头和页尾自定义

    adminx.py文件增加

    1

    2

    3

    4

    5

    6

    7

    from xadmin import views

    class GlobalSetting(object):

    site_title = "后台管理系统"

    site_footer = "http://www.feiutech.com/"

    xadmin.site.register(views.CommAdminView, GlobalSetting)

    • 左侧app中文名称定义和多表紧缩

    adminx.py文件增加

    1

    2

    3

    4

    5

    6

    7

    8

    from xadmin import views

    class GlobalSetting(object):

    site_title = "shhnwangjian后台管理系统"

    site_footer = "http://www.cnblogs.com/shhnwangjian/"

    menu_style = "accordion"

    xadmin.site.register(views.CommAdminView, GlobalSetting)

    apps.py文件

    1

    2

    3

    4

    5

    6

    7

    # -*- coding: utf-8 -*-

    from django.apps import AppConfig

    class UsersConfig(AppConfig):

    name = 'users'

    verbose_name = u'用户信息'

    __init__.py文件

    1

    default_app_config = "users.apps.UsersConfig"

    font awesome自定义

    官网下载:http://fontawesome.io/

    下载后覆盖xadmin目录下css、fonts目录

    在adminx.py文件中引入model_icon

    1

    2

    3

    4

    5

    6

    7

    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']

    model_icon = 'fa fa-address-book-o'

    xadmin.site.register(EmailVerifyRecord, EmailVerifyRecordAdmin)

    model_icon这个值,在http://fontawesome.io/icons/ 中选中的图标或class内容,如下图

    引用自定义的用户信息

    如上图目录中xadmin源码中加入下面内容

    1

    2

    from django.contrib.auth import get_user_model

    User = get_user_model()

    修改密码,需要更改源码

    actions制作案例

    adminx.py文件内容

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    24

    25

    from django.core.exceptions import PermissionDenied

    from xadmin.views.base import filter_hook

    from xadmin.util import model_format_dict, model_ngettext

    class zabbixitmes_display_off_action(BaseActionView):

    action_name = "zabbixitmes_display_off_action"

    description = u'%(verbose_name_plural)s 展示和采集关闭'

    model_perm = 'change'

    @filter_hook

    def change_models(self, queryset):

    n = queryset.count()

    if n:

    self.log('change', (u' %(count)d %(items)s. 展示和采集关闭')

    % {"count": n, "items": model_ngettext(self.opts, n)})

    for obj in queryset:

    obj.display_insert = 0

    obj.save()

    def do_action(self, queryset):

    if not self.has_change_permission():

    raise PermissionDenied

    if self.request.POST:

    self.change_models(queryset)

    return None

    提示:可以参考BaseActionView中的删除DeleteSelectedAction,可以实现xadmin自带的日志记录。用于审计操作者的操作内容。

    xadmin可以使用的页面样式控制基本与Django原生的admin一致。list_display 控制列表展示的字段
    search_fields 控制可以通过搜索框搜索的字段名称,xadmin使用的是模糊查询
    list_filter 可以进行过滤操作的列
    ordering 默认排序的字段
    readonly_fields 在编辑页面的只读字段
    exclude 在编辑页面隐藏的字段
    list_editable 在列表页可以快速直接编辑的字段
    show_detail_fileds 在列表页提供快速显示详情信息
    refresh_times 指定列表页的定时刷新
    list_export 控制列表页导出数据的可选格式
    show_bookmarks 控制是否显示书签功能
    data_charts 控制显示图标的样式
    model_icon 控制菜单的图标
    model_icon 菜单图标
    model_icon 参考http://fontawesome.dashgame.com/
    效果图
    style_fields
    控制字段的显示样式
    默认manytomany字段样式是个单排下拉框,对添加选项操作十分不友好
    level是我model中的一个多对多字段
    m2m_transfer就是多对多穿梭框样式
    ueditor是支持富文本编辑
    filter_horizontal是多对多样式字段支持过滤
    list_display
    指定xadmin中需要显示哪些字段信息,以列表显示
    list_display = ('first_name', 'last_name', 'email')
    search_fields
    指定哪些字段信息可以被搜索
    search_fields = ('first_name', 'last_name')
    list_filter
    添加哪些字段需要进行过滤显示(添加过滤器)
    list_filter = ('publication_date',) #添加过滤(这里是过滤日期)
    date_hierarchy
    添加日期过滤器,该字段只能是日期类型
    date_hierarchy = 'publication_date' #过滤(日期的另外一种过滤方式,可以添加后看一下)
    ordering
    显示的列表以什么进行排序 ,加‘-’表示降序
    ordering = ('-publication_date',) #排序(这里以日期排序,加‘-’表示降序)
    fields
    排除一些不想被其他人编辑的fields,不包含在内的字段不能编辑
    fields = ('title', 'authors', 'publisher')
    filter_horizontal
    从‘多选框’的形式改变为‘过滤器’的方式,水平排列过滤器,必须是一个 ManyToManyField类型,且不能用于 ForeignKey字段,默认地,管理工具使用下拉框 来展现外键 字段
    filter_horizontal = ('authors',)
    raw_id_fields
    将ForeignKey字段从‘下拉框’改变为‘文本框’显示
    raw_id_fields = ('publisher',)
    list_editable
    列表显示的时候,指定的字段可以直接页面一键编辑
    list_editable = ['csdevice']
    readonly_fields
    指定一些字段为只读,不可修改
    readonly_fields = ('cservice',)
    exclude
    在编辑和查看列表时指定不显示的字段
    exclude = ['cservice']
    refresh_times
    后台可选择10秒刷新一次或者60秒刷新一次如下
    refresh_times = [10, 60]
    show_detail_fields
    在指定的字段后添加一个显示数据详情的一个按钮
    show_detail_fields=['ttdsn']
    relfield_style
    后台自定义不是下拉选择框,而是搜索框(解决了为什么用户不是下拉框的问题。。)
    relfield_style = 'fk-ajax'
    8.图表
    在数据列表页面,根据列表数据生成图表,可以指定多个数据列,生成多个图表。
    在Model OptionClass 中设定data_charts属性,该属性为dict类型,key是图表的标示名称,value是图表的具体设置属性,示例:

    data_charts = {
    
        "user_count": {'title': u"User Register Raise", "x-field": "year", "y-field": ("cn",),
    
                       "order": ('year',)},
    
        # "avg_count": {'title': u"Avg Report", "x-field": "date", "y-field": ('avg_count',), "order": ('date',)}
    
        }

    图表的主要属性为:
    title : 图表的显示名称
    x-field : 图表的 X 轴数据列, 一般是日期, 时间等
    y-field : 图表的 Y 轴数据列, 该项是一个 list, 可以同时设定多个列, 这样多个列的数据会在同一个图表中显示
    order : 排序信息, 如果不写则使用数据列表的排序
    效果:
    9.数据导出
    如果想要导出Excel数据,需要安装xlwt。
    默认情况下,xadmin会提供Excel,CSV,XML,json四种格式的数据导出,可以通过设置OptionClass的list_export属性来指定使用哪些导出格式(四种格式分别用xls,csv,xml,json表示)或是将list_export设置为None来禁用数据导出功能。
    10.过滤
    在 Model OptionClass 中设置以下属性:
    list_filter 属性:
    该属性指定可以过滤的列的名字, 系统会自动生成搜索器
    search_fields 属性:
    属性指定可以通过搜索框搜索的数据列的名字, 搜索框搜索使用的是模糊查找的方式, 一般用来搜素名字等字符串字段
    free_query_filter 属性:
    默认为 True , 指定是否可以自由搜索. 如果开启自由搜索, 用户可以通过 url 参数来进行特定的搜索, 例如:
    http://xxx.com/xadmin/auth/user/?name__contains=tony
    11. 设置只读字段
    在使用xadmin的时候,ModelAdmin默认只有对于model的增删改查,但是总是有些字段是不希望用户来编辑的。而 readonly_fields 设置之后不管是admin还是其他用户都会变成只读,而我们通常只是想限制普通用户。 这时我们就可以通过重写 get_readonly_fields 方法来实现对特定用户的只读显示。

    class UserInfoAdmin():
    
    
        def get_readonly_fields(self):
    
            """  重新定义此函数,限制普通用户所能修改的字段  """
            if self.user.is_superuser:
                self.readonly_fields = []
            return self.readonly_fields
        
        readonly_fields = ('user_email',)

    效果:
    普通用户:
    admin:

    Django xadmin图片上传与缩略图处理

    python django开发时,个人选中Xadmin后台管理系统框架,因为它*内置功能丰富, 不仅提供了基本的CRUD功能,还内置了丰富的插件功能。包括数据导出、书签、图表、数据添加向导及图片相册等多种扩展功能。但是上传图片时想实现图片文件重命名并生成图片预览图时,从网上找了一些大牛写的代码,在自己的项目中出错,所以自己摸索找到使用django-stdimage(参考官方文档)生成预览图+图片重命名的解决办法,代码如下:

    step 1. 安装

    $pip install django-stdimage==3.2.0 -i "https://pypi.doubanio.com/simple/"
    

    step 2. 配置settings.py

    INSTALLED_APPS = [
    
        'django.contrib.admin',
    
        'django.contrib.auth',
    
        'django.contrib.contenttypes',
    
        'django.contrib.sessions',
    
        'django.contrib.messages',
    
        'django.contrib.staticfiles',
    
        'stdimage',  #记得一定要添加进入
    
    ] 
    

    step 3. 配置models.py

    from datetime import datetime
    from stdimage.models import StdImageField
    from stdimage.utils import UploadToUUID
    
    class Banner(models.Model):
        title = models.CharField(max_length=100, verbose_name=u"标题")
        image = StdImageField(max_length=100,                      
        upload_to=UploadToUUID(path=datetime.now().strftime('banner/%Y/%m')),
                              verbose_name=u"轮播图",
                              variations={'thumbnail': {'width': 100, 'height': 75}})
        url = models.CharField(max_length=100, verbose_name=u"访问地址")
        index = models.IntegerField(default=100, verbose_name=u"顺序")
        add_time = models.DateTimeField(default=datetime.now, verbose_name=u"添加时间")
    
        class Meta:
            verbose_name = u"轮播图"
            verbose_name_plural = verbose_name
    
        def image_img(self):
            if self.image:
                return str('<img src="%s" />' % self.image.thumbnail.url)
            else:
                return u'上传图片'
    
        image_img.short_description = '轮播图'
        image_img.allow_tags = True
    
        def __str__(self):
            return '{0}(位于第{1}位)'.format(self.title, self.index) 
    

    step 4. 配置adminx.py

    class BannerAdmin(object):
        #显示不要用image,而应该用image_img
        list_display = ['title', 'image_img', 'url', 'index', 'add_time']
        search_fields = ['title', 'url', 'index']
        list_filter = ['title',  'url', 'index', 'add_time']
    #注册轮播图
    xadmin.site.register(Banner, BannerAdmin)
    

    step 5. 配置urls.py

    from django.urls import path, re_path
    from django.views.static import serve
    import xadmin
    from Aiword.settings import MEDIA_ROOT
    
    urlpatterns = [
        path('xadmin/', xadmin.site.urls),
    
        # 处理图片显示的url,使用Django自带serve,
        # 传入参数告诉它去哪个路径找,我们有配置好的路径MEDIAROOT
        re_path('media/(?P<path>.*)', serve, {"document_root": MEDIA_ROOT}),
    ]
    

    效果图片:

    效果 图一

    效果 图二
    官方文档说明:
    默认情况下,StdImageField 存储图像而不修改文件名。
    如果您想使用更一致的文件名,可以使用内置的上传调用
    比如:

    from stdimage.utils import UploadToUUID, UploadToClassNameDir, 
    UploadToAutoSlug,UploadToAutoSlugClassNameDir
    
    
    class MyClass(models.Model):
        title = models.CharField(max_length=50)    
    
        # 文件保存到 MEDIA_ROOT/myclass/#FILENAME#.#EXT#
        image1 = StdImageField(upload_to=UploadToClassNameDir())    
    
        # 文件上传时文件名自定义后保存到 MEDIA_ROOT/myclass/pic.#EXT#
        image2 = StdImageField(upload_to=UploadToClassNameDir(name='pic'))    
    
        # 文件名自动uuid重命名上传到-> MEDIA_ROOT/images/#UUID#.#EXT#
        image3 = StdImageField(upload_to=UploadToUUID(path='images'))    
    
        # 文件根据uuid规则进行文件重命名并上传到 MEDIA_ROOT/myclass/#UUID#.#EXT#
        image4 = StdImageField(upload_to=UploadToClassNameDirUUID())    
    
        # 文件保存到 MEDIA_ROOT/images/#SLUG#.#EXT#
        image5 = StdImageField(upload_to=UploadToAutoSlug(populate_from='title'))    
       
        # 文件保存到 MEDIA_ROOT/myclass/#SLUG#.#EXT#
       image6 =StdImageField(
              upload_to=UploadToAutoSlugClassNameDir(populate_from='title'))

    参考: http://xadmin.readthedocs.io/en/docs-chinese/plugins.html

    django集成django-xadmin

  • 相关阅读:
    一、面试准备Java知识
    SSM框架学习之Spring学习笔记
    新年过后 第一天上班
    tomcat学习笔记
    第一次写博客
    SQL Server 2005 数据类型 .NET Framework 数据类型 LINQ 数据类型
    Winform下编译Dev控件时提示license.licx文件错误
    将C#数据转化成Word文档
    得到相同的数据 雨
    SQl 2005 存储过程分页 雨
  • 原文地址:https://www.cnblogs.com/feifeifeisir/p/12870412.html
Copyright © 2011-2022 走看看