You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django上传Excel并将4列内容分别在4个不同网页展示的问题求助

完整实现步骤及代码修正

你需要完成「用户上传Excel→后端解析存入数据库→分页面展示不同列数据」的全流程,现有代码的核心问题是未接收上传文件、未做数据持久化、查询对象和模板变量不匹配,按以下步骤修正即可:

1. 先安装依赖

解析xlsx格式需要对应依赖,执行安装命令:
pip install pandas openpyxl

2. 修正models.py

你现有模型基本可用,补充调试用的魔术方法即可:

class Excel(models.Model):
    structure = models.CharField(("Structure"), max_length=150)
    segment = models.CharField(("Segment"), max_length=150)
    subsegment = models.CharField(("SubSegment"), max_length=150)
    element = models.CharField(("Element"), max_length=150)
    
    def __str__(self):
        return self.structure

3. 修正views.py

现有视图需要新增上传文件接收、Excel解析、数据入库逻辑,同时新增4个列对应的展示视图:

import pandas as pd
from io import BytesIO
from django.shortcuts import redirect
from .models import Excel

def upload(request):
    if request.method == "GET":
        return render(request, 'myapp/upload.html', {})
    else:   
        # 接收上传的Excel文件
        excel_file = request.FILES.get('excel_file')
        if not excel_file:
            return render(request, 'myapp/upload.html', {'err_msg': '请先选择上传文件'})
        # 解析Excel
        df = pd.read_excel(BytesIO(excel_file.read()), sheet_name = 'ItemDetails')
        # 遍历行存入数据库
        for _, row in df.iterrows():
            Excel.objects.create(
                structure = str(row['Structure']),
                segment = str(row['Segment']),
                subsegment = str(row['SubSegment']),
                element = str(row['Element'])
            )
        # 上传完成跳转到结构列展示页,也可以自定义跳转页
        return redirect('structure')

# 展示structure列的视图
def structure(request):
    structures = Excel.objects.values_list('structure', flat=True).distinct()
    return render(request, 'myapp/structuremaster.html', {'datas': structures})

# 展示segment列的视图
def segment(request):
    segments = Excel.objects.values_list('segment', flat=True).distinct()
    return render(request, 'myapp/segmentmaster.html', {'datas': segments})

# 展示subsegment列的视图
def subsegment(request):
    subsegments = Excel.objects.values_list('subsegment', flat=True).distinct()
    return render(request, 'myapp/subsegmentmaster.html', {'datas': subsegments})

# 展示element列的视图
def element(request):
    elements = Excel.objects.values_list('element', flat=True).distinct()
    return render(request, 'myapp/elementmaster.html', {'datas': elements})

4. 补充/修正模板文件

上传页模板 myapp/upload.html

需要添加上传文件的表单,注意必须加enctype="multipart/form-data"属性:

<form method="post" enctype="multipart/form-data">
    {% csrf_token %}
    <input type="file" name="excel_file" accept=".xlsx,.xls">
    <button type="submit">上传</button>
    {% if err_msg %}
    <p style="color:red">{{ err_msg }}</p>
    {% endif %}
</form>

列展示模板(以structuremaster.html为例,其他三个模板仅修改页面标题即可)

<table>
  <thead>
    <tr>
      <th>Structure列内容</th>
    </tr>
  </thead>
  <tbody>
    {% for item in datas %}
    <tr>
      <td>{{ item }}</td>
    </tr>
    {% endfor %}
  </tbody>
</table>

5. 配置urls.py

在myapp的urls.py中添加对应路由:

from django.urls import path
from . import views

urlpatterns = [
    path('upload/', views.upload, name='upload'),
    path('structure/', views.structure, name='structure'),
    path('segment/', views.segment, name='segment'),
    path('subsegment/', views.subsegment, name='subsegment'),
    path('element/', views.element, name='element'),
]

测试流程

  1. 启动服务后先访问/upload页上传符合要求的Excel文件
  2. 上传完成后自动跳转到structure列展示页
  3. 分别访问/segment、/subsegment、/element即可查看其他列的内容

内容的提问来源于stack exchange,提问作者user17085922

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 06:24:05