在Django模板上显示上载的csv文件

在Django模板上显示上载的csv文件,django,csv,django-templates,Django,Csv,Django Templates,我有一个项目,接受上传的.csv文件,并通过models.py在管理员上显示它。我想做的是在模板上显示这些上传的.csv文件 我的看法是: def data_upload(request): template = "home.html" if request.method == 'GET': return render(request, template) csv_file = request.FILES['file'] if not csv_

我有一个项目,接受上传的.csv文件,并通过models.py在管理员上显示它。我想做的是在模板上显示这些上传的.csv文件

我的看法是:

def data_upload(request):
    template = "home.html"

    if request.method == 'GET':
        return render(request, template)

    csv_file = request.FILES['file']
    if not csv_file.name.endswith('.csv'):
        messages.error(request, 'Please upload a .csv file.')

    data_set = csv_file.read().decode('ISO-8859-1')
    io_string = io.StringIO(data_set)
    next(io_string)
    for column in csv.reader(io_string, delimiter=','):
        _, created = Table.objects.update_or_create(
            page=column[0], 
            keyword=column[1], 
            interval=column[2], 
            email=column[3], 
            notes=column[4], 
            billing=column[5],
        )
    context = {
    'tables': Table.objects.all()
    }
    return render(request, template, context)
当我上传.csv文件时,视图已经在工作了

在home.html文件中,我做了以下操作:

                       <table class="table table-condensed">
                        <thead>
                        <tr>
                            <th>...</th>
                        </tr>
                        </thead>
                        <tbody>
                        <tr>
                            <th class="center-align" scope="row"><i class="small material-icons green">check</i></th>
                            {% for t in tables %}
                            <td class="center-align">{{t.page}}</td>
                            <td class="center-align">{{t.keyword}}</td>
                            <td class="center-align">{{t.interval}}</td>
                            <td class="center-align">{{t.email}}</td>
                            <td class="center-align">{{t.notes}} </td>
                            <td class="center-align">{{t.billing}}</td>
                            {% endfor %}
                        </tr>
                       </table>
如何正确地迭代模板以显示我在html文件中上载的内容?

如果不上载文件,代码不会超过第一次返回

除非上传CSV,否则代码将在此停止,因此不会向模板发送任何数据。这就是{{tables}}返回空白的原因。当数据在数据库中时,模板中的{{tables}}永远不会在此呈现中填充

    if request.method == 'GET':
        return render(request, template)
只有在实际上传CSV时,才会输出任何内容并填写表格。任何不是来自绿色大上载按钮的请求都不会运行会给模板中的{tables}任何数据的代码

以下代码仅在CSV上载时运行

csv_file = request.FILES['file']
    if not csv_file.name.endswith('.csv'):
        messages.error(request, 'Please upload a .csv file.')

    data_set = csv_file.read().decode('ISO-8859-1')
    io_string = io.StringIO(data_set)
    next(io_string)
    for column in csv.reader(io_string, delimiter=','):
        _, created = Table.objects.update_or_create(
            page=column[1], 
            keyword=column[2], 
            interval=column[3], 
            email=column[4], 
            notes=column[5], 
            billing=column[6],
        )
    context = {
        'tables': Table.objects.all()
    }
    print(Table.objects.all())
    return render(request, template, context)
这行吗

context = {'tables': Table.objects.all()}
这假设表中只有CSV中的元素

编辑,如何修复模板

改变这个

                            <tr>
                                <th class="center-align" scope="row"><i class="small material-icons green">check</i></th>
                                {% for t in tables %}
                                <td class="center-align">{{t.page}}</td>
                                <td class="center-align">{{t.keyword}}</td>
                                <td class="center-align">{{t.interval}}</td>
                                <td class="center-align">{{t.email}}</td>
                                <td class="center-align">{{t.notes}} </td>
                                <td class="center-align">{{t.billing}}</td>
                                {% endfor %}
                            </tr>
在home.html中创建此文件


基本上,使标记进入for循环内部,而不是外部

为什么要按列进行CSV?“按行”将使模板中的操作更简单。@MatthewGaiser我不明白。你会怎么做?CSV实际上并不是按列进行的。这是按行进行的。mastercode.online教程视频中的家伙使用column作为for循环中的循环变量,但我们都知道csv.reader返回行或行,而不是列。他应该将循环变量命名为row或line以使其更有意义。如果您打印TABLE.objects.all,会发生什么?这就是应该在其中的内容吗?您能给我一张{tables}在模板页面上转储的图片吗?这些只是csv文件的一行。请检查您的数据库以确保数据在那里吗?
{% for t in tables %}
                            <tr>
                                <th class="center-align" scope="row"><i class="small material-icons green">check</i></th>

                                <td class="center-align">{{t.page}}</td>
                                <td class="center-align">{{t.keyword}}</td>
                                <td class="center-align">{{t.interval}}</td>
                                <td class="center-align">{{t.email}}</td>
                                <td class="center-align">{{t.notes}} </td>
                                <td class="center-align">{{t.billing}}</td>

                            </tr>
                            {% endfor %}