新建excel.py 导入插件\xadmin\plugins\目录下
import xadmin
from xadmin.views import BaseAdminPlugin, ListAdminView
from django.template import loader
#excel 导入
class ListImportExcelPlugin(BaseAdminPlugin):
import_excel = False
def init_request(self, *args, **kwargs):
return bool(self.import_excel)
def block_top_toolbar(self, context, nodes):
nodes.append(loader.render_to_string('xadmin/excel/model_list.top_toolbar.import.html', context_instance=context))
xadmin.site.register_plugin(ListImportExcelPlugin, ListAdminView)
html代码如下,放入nodes下的指定路径
xadmin/excel/model_list.top_toolbar.import.html
1 {% load i18n %} 2 <div class="btn-group export"> 3 <a class="dropdown-toggle btn btn-default btn-sm" data-toggle="dropdown" href="#"> 4 <i class="icon-share"></i> 导入 <span class="caret"></span> 5 </a> 6 <ul class="dropdown-menu" role="menu" aria-labelledby="dLabel"> 7 <li><a data-toggle="modal" data-target="#export-modal-import-excel"><i class="icon-circle-arrow-down"></i> 导入 Excel</a></li> 8 </ul> 9 <script> 10 function fileChange(target){ 11 //检测上传文件的类型 12 var imgName = document.all.submit_upload.value; 13 var ext,idx; 14 if (imgName == ''){ 15 document.all.submit_upload_b.disabled=true; 16 alert("请选择需要上传的 xls 文件!"); 17 return; 18 } else { 19 idx = imgName.lastIndexOf("."); 20 if (idx != -1){ 21 ext = imgName.substr(idx+1).toUpperCase(); 22 ext = ext.toLowerCase( ); 23 {# alert("ext="+ext);#} 24 if (ext != 'xls' && ext != 'xlsx'){ 25 document.all.submit_upload_b.disabled=true; 26 alert("只能上传 .xls 类型的文件!"); 27 28 return; 29 } 30 } else { 31 document.all.submit_upload_b.disabled=true; 32 alert("只能上传 .xls 类型的文件!"); 33 return; 34 } 35 } 36 37 } 38 </script> 39 <div id="export-modal-import-excel" class="modal fade"> 40 <div class="modal-dialog"> 41 <div class="modal-content"> 42 <form method="post" action="" enctype="multipart/form-data"> 43 {% csrf_token %} 44 <div class="modal-header"> 45 <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button> 46 <h4 class="modal-title">导入 Excel</h4> 47 </div> 48 <div class="modal-body"> 49 <input type="file" onchange="fileChange(this)" name="excel" id="submit_upload"> 50 51 </div> 52 <div class="modal-footer"> 53 <button type="button" class="btn btn-default" data-dismiss="modal">{% trans "Close" %}</button> 54 <button class="btn btn-success" type="submit" id="submit_upload_b"><i class="icon-share"></i> 导入</button> 55 </div> 56 </form> 57 </div><!-- /.modal-content --> 58 </div><!-- /.modal-dalog --> 59 </div><!-- /.modal --> 60 61 </div>
在adminx.py中重载post方法,并设置导入开关
1 import_excel = True #控制开关 2 3 4 def queryset(self): 5 qs = super(CourseAdmin,self).queryset() 6 qs = qs.filter(is_banner = False) 7 return qs 8 9 def save_models(self): 10 #在保存课程是后统计课程的课程数 11 obj = self.new_obj 12 obj.save() 13 if obj.course_org is not None: 14 course_org = obj.course_org 15 course_org.courses = Course.objects.filter(course_org=course_org).count() 16 course_org.save() 17 #定义重载post方法来获取excel表格中的数据 18 def post(self,request,*args,**kwargs): 19 if 'excel' in request.FILES: 20 execl_file = request.FILES.get('excel') 21 files = open_workbook(filename=None, file_contents=request.FILES['excel'].read()) 22 excel_into_model('course', 'Course', excel_file=files) 23 return HttpResponseRedirect('/xadmin/course/course') 24 return super(CourseAdmin,self).post(request,*args,**kwargs)
处理excel文件导入model方法
def excel_into_model(appname,model_name,excel_file): #tmp[7].verbose_name.__str__() try: appname_ = apps.get_model(appname,model_name) fields = appname_._meta.fields #导入model,动态导入 exec('from %s.models import %s' %(appname,model_name)) except : logger.info('model_name and appname is not exist') field_name = [] #只导入第一个sheet中的数据 table = excel_file.sheet_by_index(0) nrows = table.nrows table_header = table.row_values(0) for cell in table_header: for name in fields: if cell in name.verbose_name.__str__(): field_name.append(name.name) if 'add_time' in field_name: field_name.remove('add_time') for x in range(1, nrows): # 行的数据,创建对象,进行报错数据 exec('obj' + '=%s()' % model_name) print(len(field_name)) for y in range(len(field_name)): exec ('obj.%s'%field_name[y]+'="%s"' %(table.cell_value(x,y))) exec ('obj.save()')