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

时间:2019-09-13 08:34:54

标签: 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_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文件中上传的内容?

1 个答案:

答案 0 :(得分:1)

如果您不上传文件,则代码不会超出第一个返回值

除非上传CSV,否则代码将在此处停止,因此不会将任何数据发送到模板。这就是{{table}}返回空白的原因。当数据在数据库中时,模板中的{{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()}

这假设Table中的唯一元素是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>
{% 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 %}

为此home.html

基本上,使<tr></tr>标记位于for循环内而不是外部。