新建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()')