django-import-export 这个第三方包可以导入也可以导出 ,导入以前用原生的写过了,我们本次展示导出。
python 3.8.0
django 2.2.0
pip install django-import-export
#settings.py
INSTALLED_APPS=[
"import_export",
]
引用你已经建好的models.py,对导出内容进行设置,如果内容较多,可以新建一个resources.py 文件,也可以直接写进admin.py 文件中,我就是直接写进admin.py
#admin.py
from import-export import resources
from import-export.admin import ImportExportModelAdmin
from import-export import fields
from import-export.farmats import base_farmats
...
class BillResources(resources.ModelResource):
class Meta:
model = Bill
fields = (
"status",
"billitem__name",
"room__unit",
"total",
...
) #要导出的字段
export_order = (
"status",
"billitem__name",
"room__unit",
"total",
...
) #导出的字段的排序
#接下来是admin中注册的修改
class BillAdmin(ImportExportModelAdmin):
list_display = (
"code",
"status",
"billitem",
"room",
"total",
...
)
list_filter = (
"status",
"billitem",
)
resource_class = BillResources #这是加上的与导出配置关联设置,前面是注册admin的常规设置,根据个人需要
上面简单设置完运行程序就可以看到:
右上角可以看到多出一个导入和导出,但是这还存在很多需要调整的问题。生成的表头是英文,不是当前对应的中文。
这个需要写一个方法对应到models里面设置的vernbose_name
class BillResources(resources.ModelResource):
def __init__(self):
super(BillResources, self).__init__()
field_list = Bill._meta.fields
self.vname_dict = {}
for i in field_list:
self.vname_dict[i.name] = i.verbose_name
def get_export_fields(self):
fields = self.get_fields()
for i, field in enumerate(fields):
field_name = self.get_field_name(field)
if field_name.find("__") > 0:
_field_name = field_name.split("__")[0]
if _field_name in self.vname_dict.keys():
field.column_name = self.vname_dict[_field_name]
elif field_name in self.vname_dict.keys():
field.column_name = self.vname_dict[field_name]
return fields
status = fields.Field(
attribute="get_status_display", column_name=(u"status")
)
#上面的方法重写把表头显示成中文,还有外键如果写成"room__unit",这种样子的话,表头又还会显示英文,所以上面也做了分割。
status 按照上面设置后会正常显示,不然会显示存入数据库的数字。
关于导出格式。默认是有这么多的,如果只想弄某种格式。限制的格式的话如下可以设置
class BillAdmin(ImportExportModelAdmin):
def get_export_formats(self): #该方法是限制格式
formats = (
base_formats.XLS,
)
return [f for f in formats if f().can_export()]
def has_import_permission(self, request): #这是隐藏导入按钮,如果隐藏其他按钮也可以这样操作,
return False
最后最后注意外键要正常显示,不能只写字段名,还要链接到外键表格的对应字段,例如: “room__unit”
这些都设置完 基本 就是我们想要的结果了。