在Django模板上显示上载的csv文件
我有一个项目,接受上传的.csv文件,并通过models.py在管理员上显示它。我想做的是在模板上显示这些上传的.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_
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 %}