在Djaong项目中,需要在Admin中添加导入excle功能,将其中的数据导入到数据库中。
下方代码直接引用到自己项目就能用(需要修改一个地方)
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
#2021-02-27 admin添加导入功能,文件表单
class ExcelImportForm(forms.Form):
excel_file = forms.FileField()
#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))
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',
],
},
},
]
{% extends 'admin/change_list.html' %}
{% block object-tools-items %}
{{ block.super }}
导入
{% endblock %}
{% extends 'admin/base.html' %}
{% block content %}
返回
{% endblock %}
1.替换(重写)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 }}
导入
{% endblock %}