众所周知,在使用
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 = 'tablib.formats._zip'
CONTENT_TYPE = 'application/x-zip-compressed'
def create_dataset(self, in_stream, **kwargs):
创建数据集
@params:in_stream: request content
from zipfile import ZipFile
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)
custom_operation(nums)
result = self.get_result_class()()
result.totals = len(nums)
return result
4、注册自定义的 Format
from tablib.formats import registry
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类似,就是定义你要导入或者导出的数据格式。