需求场景描述
在Djaong项目中,需要在Admin中添加导入excle功能,将其中的数据导入到数据库中。
下方代码直接引用到自己项目就能用(需要修改一个地方)
新增代码
- 导入包(admin.py最上方)
from django.forms import forms #2021-02-27 admin添加导入功能,上传文件
from django.shortcuts import redirect, render #2021-02-27 admin添加导入功能
from django.urls import path #2021-02-27 admin添加导入功能,增加url
import pandas #2021-02-27 admin添加导入功能,解析excel
- 导入表单(要增加导入功能的admin类上方)
#2021-02-27 admin添加导入功能,文件表单
class ExcelImportForm(forms.Form):
excel_file = forms.FileField()
- 具体代码(要添加导入的admin类中)
#2021-02-27 admin添加导入功能
#用于在界面上新增导入按钮
change_list_template = "admin/changelist.html"
#2021-02-27 admin添加导入功能,新增导入url
#RiskAssessAdmin需替换成相应的类
def get_urls(self):
urls = super(RiskAssessAdmin, self).get_urls()
print(urls)
my_urls = [
path('importExcel/', self.import_excel, name="import_excel"),
]
return my_urls + urls
#2021-02-27 admin添加导入功能,导入按钮对应功能
def import_excel(self, request):
if request.method == "POST":
excel_file = request.FILES["excel_file"]
# 将数据保存到数据库中
self.save_workgroup(excel_file)
self.message_user(request, "excel文件上传成功!")
return redirect("../")
form = ExcelImportForm()
payload = {"form": form}
return render(request, "admin/excel_form.html", payload)
# 将上传的工作组文件保存到数据库中 #2021-02-27 admin添加导入功能
def save_workgroup(self,excel_file):
print(excel_file)
df = pandas.read_excel(excel_file)
print(type(df))
- 添加模板配置(settings.py)
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
#2021-02-27 admin添加导入功能,用于配置模板路径
'DIRS': [os.path.join(BASE_DIR, 'templates')],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
- 模板配置
在项目根目录下新建templates文件夹,templates新建admin文件夹,admin文件夹下新建两个html文件
<!--changelist.html -->
{% extends 'admin/change_list.html' %}
{% block object-tools-items %}
{
{ block.super }}
<li>
<a href="importExcel/" class="addlink">导入</a>
</li>
{% endblock %}
<!--excel_form.html -->
{% extends 'admin/base.html' %}
{% block content %}
<a href="../"><i class="el-icon-arrow-left"></i><span>返回</span></a>
<div>
<form action="." method="POST" enctype="multipart/form-data">
{
{ form.as_p }}
{% csrf_token %}
<button type="submit">上传</button>
</form>
</div>
<br/>
{% endblock %}
可能遇到问题
- Excel xlsx file; not supported
原因及解决办法:
原因是最近xlrd更新到了2.0.1版本,只支持.xls文件。所以pandas.read_excel(‘xxx.xlsx’)会报错。
可以安装旧版xlrd,在cmd中运行:
pip uninstall xlrd
pip install xlrd==1.2.0
也可以用openpyxl代替xlrd打开.xlsx文件:
df=pandas.read_excel(‘data.xlsx’,engine=‘openpyxl’)
原文链接
总结
1.替换(重写)Django-admin中的模板
- Django-admin自带的模板路径在:D:\Python36\Lib\site-packages\django\contrib\admin\templates\admin目录下。D:\Python36是本地安装的python路径。如果不知道该路径在哪。在控制台输入 python->import sys + 回车 -> sys.path就可以看到。
- 重写Django-admin原有的页面(例如本例子中新增一个按钮)
<!-- 先继承要重写的页面 -->
{% extends 'admin/change_list.html' %}
<!-- 选择要重写的块 -->
{% block object-tools-items %}
{% endblock %}
<!-- 保留原来的数据 -->
{% block object-tools-items %}
{
{ block.super }}
{% endblock %}
<!-- 新增自己的功能 -->
{% block object-tools-items %}
{
{ block.super }}
<li>
<a href="importExcel/" class="addlink">导入</a>
</li>
{% endblock %}