class TeacherResource(resources.ModelResource):
def __init__(self):
super(TeacherResource, self).__init__()
# 获取模型的字段列表,
field_list = teacher._meta.fields
# 做成一个{字段名:中文名}的字典,作为成员变量
self.vname_dict = {i.name:i.verbose_name for i in field_list}
# 每一个field中包含有name和verbose_name, 直接提取转化为字典
# 如果导入和导出的表头都需要为中文,只重写get_fields即可
def get_fields(self, **kwargs):
fields = super().get_fields(**kwargs)
for field in fields:
field_name = self.get_field_name(field)
# 自定义导出字段里可能有关联关系,但vname_dict肯定没有双下划线,所以必须处理
if field_name.find("__") > 0:
# 如果是关联关系的,只取字段名,不找关联,因为关联内容不在vname_dict里
field_name = field_name.split("__")[0]
# 如果此字段有verbose_name,就用
if field_name in self.vname_dict.keys():
field.column_name = self.vname_dict[field_name]
return fields
import_id_fields = ['phone', 'id_card_num']
# 例如
@admin.register(teacher)
class TeacherAdmin(ImportExportModelAdmin):
def get_export_formats(self): #该方法是限制格式
formats = (
base_formats.CSV,
)
return [f for f in formats if f().can_export()]
resource_class = TeacherResource
# 重写内置的BooleanWidget
from import_export.widgets import ForeignKeyWidget, BooleanWidget
class TeacherBooleanWidget(BooleanWidget):
def render(self, value, obj):
# 如果模型字段做了`null=True`的设置,这里就可以处理“真、假、未知”三种状态
if value in self.NULL_VALUES:
return "未知"
return '是' if value else '否'
def clean(self, value, row, *args, **kwargs):
if value in self.NULL_VALUES:
return None
return True if value in ['是','否'] else False
# 在Resource里再声明一下字段
class TeacherResource(resources.ModelResource):
is_teacher_college = Field(attribute='is_teacher_college', widget=TeacherBooleanWidget())
is_teacher_major = Field(attribute='is_teacher_major', widget=TeacherBooleanWidget())