首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Django模板上显示上传的csv文件

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

Stack Overflow用户
提问于 2019-09-13 08:34:54
回答 1查看 2.2K关注 0票数 0

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

我的意见是:

代码语言:javascript
复制
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文件上,我就是这样做的:

代码语言:javascript
复制
                       <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文件上的内容?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-09-13 08:59:44

如果您不上传一个文件,代码不会超过第一个返回的

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

代码语言:javascript
复制
    if request.method == 'GET':
        return render(request, template)

只有在实际上传CSV的情况下,才能输出任何内容并填写表。任何不是来自大的绿色上传按钮的请求都不会运行代码,这将给模板中的{tables}提供任何数据。

下面的代码只在CSV上传的时候运行。

代码语言:javascript
复制
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)

这行得通吗?

代码语言:javascript
复制
context = {'tables': Table.objects.all()}

这假设表中的唯一元素是CSV中的元素。

编辑,如何修复模板

改变这个

代码语言:javascript
复制
                            <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>
代码语言:javascript
复制
{% 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循环而不是外部。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57920042

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档