众所周知,在使用 Django 时,经常会用到导入导出功能。 Django 官方为我们提供了 actions 插槽实现了绑定 Model 的一些操作。

基于此,我们可以利用该函数实现选中下载,选中上传更新等操作。但是本文不讨论该函数,感兴趣的朋友可以参考: Django Admin actions

本文讨论第三方库 django-import-export ,该库基于 tablib 点此查看 )实现了

Excel 
Pandas DataFrames
LaTeX

上述文件的导入与导出。但是,如果我们需要导入的文件类型不在上述列表中又该如何操作?

下面通过上传 zip 压缩文件(zipfile+django-import-export)举例进行说明,正文开始。

1、定义 Format

class ZIPFormat(TablibFormat):
    # 上传中间页显示的格式名称
    title = 'zip'
    # tablib需要定义的module名称,后续会通过split的方式进行切分校验
    TABLIB_MODULE = 'tablib.formats._zip'
    # 文件上传时校验的 request header type
    CONTENT_TYPE = 'application/x-zip-compressed'
    def create_dataset(self, in_stream, **kwargs):
        创建数据集
        @params:in_stream: request content
        from zipfile import ZipFile
        # 由于 zipfile 的原因,无法直接读取请求流,所以需要BytesIO进行转换
        f = ZipFile(io.BytesIO(in_stream), 'r')
        return f
    @classmethod
    def import_set(cls, dset, in_stream):
        鉴定是否有导入权限的函数,同时对数据集进行一些设置,没有该函数页面将不会显示导入按钮
        同理,导出需实现export_set函数
        同样,我们也可以通过 can_import(self),can_export(self)函数直接返回True
        dset.wipe()
        dset.dict = in_stream

2、定义 Storage

class ZipStorage(TempFolderStorage):
	这里继承了 import_export.tmp_storages中的TempFolderStorage类
	亦可以继承同级的BaseStorage类,但是需要多实现一个remove方法
    def save(self, data):
        必须实现的save方法
        from zipfile import ZipFile
        with ZipFile(self.get_full_path(), 'w') as file:
            file.write(data)
    def read(self):
        必须实现的read方法,这里返回了使用zipfile读取文件后的压缩包内部数据
        from zipfile import ZipFile
        with ZipFile(self.get_full_path(), 'r') as file:
            return file.infolist()

3、编写 Resource

class ZIPResource(resources.ModelResource):
    这里通过绑定指定类进行编写,实际使用时仅显示不校验
    class Meta:
        model = BookModel
        fields = ('avator', )
    def import_data(self, dataset, dry_run=False, raise_errors=False, use_transactions=None, collect_failed_rows=False, rollback_on_validation_errors=False, **kwargs):
        一步到位直接重写import_data方法,自定义自己所需要的操作
        @params:dataset: 前文中的dataset
        其余参数这里不再赘述
        # 指定上传路径
        ep = Path(BASE_DIR, "images", 'upload').resolve()
        # 获取压缩包内的图片数量
        nums = dataset.infolist()
        dataset.extractall(ep, nums)
        # 自定义操作,model更新等...
        custom_operation(nums)
        # 自定义返回对象
        result = self.get_result_class()()
        # 设置返回对象的总添加数
        # 可以根据需求对更新数量同步更改
        result.totals = len(nums)
        return result

4、注册自定义的 Format

from tablib.formats import registry
# 导入tablib的registry实例对自定义的Format进行注册
registry.register("zip", ZIPFormat())

5、(可选)自定义返回消息

from django.contrib import messages
from import_export.admin import ImportMixin
class CustomImportMixin(ImportMixin):
    自定义mixin工具类,继承ImportMixin,export同理
    def add_success_message(self, result, request):
        请求成功时页面弹出的消息
        通过 django 的 messages 进行消息的通信
        success_message = '文件上传成功, 本次共解压 %s 张图片.' % result.totals
        messages.success(request, success_message)

通过上述步骤,我们便可以在 Django Admin中实现自定文件类型的操作,同时避免了绑定Model的操作。

当然,上述的操作只是作为初级使用文档,更多的好玩用法可以参考官方文档与阅读源码。

凡有所学,皆成性格。

django-admin-list-filter-dropdown 呈现为下拉列表的Django管理过滤器实现。 如果要在Django admin过滤的字段具有十个以上的值,则过滤侧边栏会变得很长,混乱且难以使用。 此应用程序包含DropdownFilter类,该类在过滤侧边栏显示为下拉列表,以避免出现此问题。 pip install django-admin-list-filter-dropdown 在settings.py启用: INSTALLED_APPS = ( ' django_admin_listfilter_dropdown django-foldable-admin django-foldable-admin允许折叠/扩展应用程序部分。 :skull_and_crossbones: 此项目不再受支持 :skull_and_crossbones: Django> = 1.8(自Django> = 2起未在新版本上进行测试) Python 2.7或> = 3.3(由于Python> = 3.4,因此未在新版本上进行测试) 您可以在django-foldable-admin文件夹找到所有必需的文件。 将以下模板添加到您的templates目录。 例如: templates └── admin ├── foldable_admin.html └── index.html 如果您有自己的覆盖的admin/index.html模板,则需要在其覆盖{% block content %} : { % block content % } 顾名思义,django-import-export是一个用于处理导入和导出数据的库。它支持多种格式,包括xls、csv、json、yaml以及tablib支持的所有其他格式。它还可以轻松与... 前言之前写过两篇跟这个插件有关的文章,可以回顾一下:Django数据导入导出神器django-import-export使用Django-Import-Export插件关于外键的处理最近有个朋友留言问我一个关于django-import-export插件的问题为了形象表达这个问题,我举个书籍管理的例子来描述一下数据库表idnameprice1book1102book2203book330要导入的E... 在windows系统,使用pycharm软件,利用python的web开发框架django,来搭建一个公司后台管理系统。上边的图标网址可以自行更换,或将图片放入mypro/myblog/static/image/目录下。Terminal终端输入:pip install django-simpleui。解决办法:先屏蔽掉settings.py的这句代码,再执行克隆语句。打开settings.py,找到INSTALLED_APPS,在。3.SIMPLEUI插件使用方法。3.引入 SIMPLEUI插件。 是导出的字段顺序,fields是定义字段导入(注意字段是否能为空)fields = ('id', 'topic', 'title', 'date_added','text',) #定义需要导入哪些字段export_order = ('id', 'title','topic', 'date_added','text',) #定义导出的字段顺序。 无论怎么都不可能使用权限分组的方法,让一个超级用户使用不了其他用户组的权限功能,所以这样子就会看起来很奇怪,比如一个公司里有财务部,销售部,技术部,那么超级用户就可以用到财务部、销售部、技术部的功能模块,所以看起来超级用户的后台管理界面就很奇怪。这个生产环境的默认静态文件路径,这样就后面就不会奇怪,为什么我的静态文件都不见了之类的,笔者就是碰到了,对这 Django 的静态文件配置理解不深。e ,那么你就要小心了,Django 特别讲究,在测试环境下时,就默认把测试环境下的静态文件都放在。 Django以快速开发闻名,但是如果处理数据的导出导入还需要自己写脚本,那就有违“Python之禅”了…… pip install django-import-export 然后得添加到INSTALLED_APPS里面 # settings.py INSTALLED_APPS = ( 'import_export', 编写Resource 不得不说,这很Django Resource的写法与Model、Form类似,就是定义你要导入或者导出的数据格式。