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

Django新手求助:如何读取CSV文件并通过Django模板以表格形式展示数据

How to Display CSV Data as a Table in Django Templates

Hey there! I see you're trying to read a CSV file and show its data as a table in a Django template, but your current code is set up to download a CSV instead. Let's fix this up step by step.

First, Let's Fix Your views.py

Your current code generates a downloadable CSV response, but we need to read the CSV file's content and pass it to a template instead. Here's the corrected version:

import csv
import os
from django.shortcuts import render
from django.conf import settings

def my_view(request):
    # Use BASE_DIR to get the absolute path to your CSV file (avoids path issues)
    csv_file_path = os.path.join(settings.BASE_DIR, 'birthdeath.csv')
    
    csv_data = []
    csv_headers = []
    
    try:
        with open(csv_file_path, mode='r', encoding='utf-8') as csv_file:
            reader = csv.reader(csv_file)
            # Grab the first row as headers (skip this if your CSV has no headers)
            csv_headers = next(reader)
            # Read all remaining rows into our data list
            csv_data = list(reader)
    except FileNotFoundError:
        # Handle the case where the CSV file doesn't exist
        csv_data = []
        csv_headers = ["Error", "File Not Found"]
    
    # Pass headers and data to the template
    return render(request, 'csv_table.html', {
        'headers': csv_headers,
        'data': csv_data
    })

Key Changes Here:

  • We use Python's built-in csv module to read the file instead of trying to generate a download.
  • os.path.join(settings.BASE_DIR, ...) ensures we use an absolute path to your CSV, so Django can always find it no matter where your app is running.
  • We handle the case where the CSV file is missing to avoid server errors.
  • We pass both the headers (first row of the CSV) and the data rows to the template.

Next, Create an HTML Template for the Table

Your template.txt is set up for generating CSV content, but we need an HTML template to display a table. Create a new file templates/csv_table.html (make sure your TEMPLATES setting in settings.py points to the templates folder):

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>CSV Data Table</title>
    <style>
        /* Add some basic styling to make the table look clean */
        table {
            border-collapse: collapse;
            width: 90%;
            margin: 2rem auto;
            font-family: Arial, sans-serif;
        }
        th, td {
            border: 1px solid #ddd;
            padding: 0.8rem;
            text-align: left;
        }
        th {
            background-color: #f5f5f5;
            font-weight: bold;
        }
        tr:nth-child(even) {
            background-color: #f9f9f9;
        }
        h1 {
            text-align: center;
            margin-top: 2rem;
        }
    </style>
</head>
<body>
    <h1>CSV Data from birthdeath.csv</h1>
    
    {% if data %}
        <table>
            <!-- Table Header -->
            <thead>
                <tr>
                    {% for header in headers %}
                        <th>{{ header }}</th>
                    {% endfor %}
                </tr>
            </thead>
            <!-- Table Body -->
            <tbody>
                {% for row in data %}
                    <tr>
                        {% for item in row %}
                            <td>{{ item }}</td>
                        {% endfor %}
                    </tr>
                {% endfor %}
            </tbody>
        </table>
    {% else %}
        <p style="text-align: center; color: #dc3545;">No data available to display.</p>
    {% endif %}
</body>
</html>

What This Template Does:

  • Uses Django template tags ({% for %}) to loop through headers and data rows, building an HTML table.
  • Includes basic CSS to make the table readable and visually appealing.
  • Shows a friendly message if there's no data (or if the file was missing).

Finally, Set Up the URL Route

Make sure your urls.py has a route pointing to your view:

from django.urls import path
from . import views

urlpatterns = [
    # Add this line to map the URL to your view
    path('csv-table/', views.my_view, name='csv_table'),
]

Now if you run your Django server and visit http://localhost:8000/csv-table/, you'll see your CSV data displayed as a clean table!

Quick Notes for Your Django Journey:

  • Always use absolute paths for files (like we did with settings.BASE_DIR) to avoid "file not found" errors when deploying your app.
  • If your CSV uses a different encoding (like GBK for Chinese characters), change encoding='utf-8' to match your file's encoding.
  • For large CSV files, consider adding pagination to avoid loading hundreds/thousands of rows at once (Django has built-in pagination tools!).

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 11:39:05