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文件

{% extends 'admin/change_list.html' %}
{% block object-tools-items %}
    {{ block.super }}
    
  • 导入
  • {% endblock %}
    
    {% extends 'admin/base.html' %}
    {% block content %}
        返回
        
    {{ form.as_p }} {% csrf_token %}

    {% 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 }}
    
  • 导入
  • {% endblock %}

    你可能感兴趣的:(django,django)