Django Admin添加导入功能

Django Admin添加导入功能

需求场景描述

在Djaong项目中,需要在Admin中添加导入excle功能,将其中的数据导入到数据库中。
下方代码直接引用到自己项目就能用(需要修改一个地方)

新增代码

  1. 导入包(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
  1. 导入表单(要增加导入功能的admin类上方)
#2021-02-27 admin添加导入功能,文件表单
class ExcelImportForm(forms.Form):
    excel_file = forms.FileField()
  1. 具体代码(要添加导入的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))    
  1. 添加模板配置(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',
            ],
        },
    },
]
  1. 模板配置
    在项目根目录下新建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 %}

可能遇到问题

  1. 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 %}

猜你喜欢

转载自blog.csdn.net/hahahzzzzz/article/details/114173664
今日推荐