django xadmin后台excel表格导入数据库

新建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">&times;</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()')

 

 





posted on 2018-03-27 10:46  帅盗 阅读( ...) 评论( ...) 编辑 收藏

转载于:https://www.cnblogs.com/Jirison/p/8656228.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值