我有一个项目,该项目接受上载的.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文件中上传的内容?
答案 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循环内而不是外部。