django - 在Django中上传的csv没有保存
问题描述
该项目的唯一目的是在模板上显示上传的 csv。有用。但是当我重新启动服务器时,或者即使我只是刷新页面,上传的 csv 数据也会消失。请求处理没有通过上下文将任何数据传递给模板。
我的views.py是:
import csv, io
from django.shortcuts import render
from django.contrib import messages
from .models import Table
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)
模板上传表单为:
<form method="POST" enctype="multipart/form-data" action="">{% csrf_token %}
<div class="file-field input-field">
<div class="btn">
<span>Upload a CSV FILE</span>
<input type="file" name="file">
</div>
<div class="file-path-wrapper">
<input class="file-path validate" type="text">
</div>
<button class="waves-effect waves-light btn teal" type="submit">Upload</button>
</div>
我知道我在某个地方需要一个 .save() ,我已经尝试过了,但它不起作用。
任何人?
解决方案
正如@Mehran 提到的,您在 GET 请求期间没有传递“表”上下文。这就是为什么您在 POST 而不是 GET 中获取数据的原因。
import csv, io
from django.shortcuts import render
from django.contrib import messages
from .models import Table
def data_upload(request):
template = "home.html"
if request.method == 'POST':
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],
)
elif request.method == 'GET':
# DO something in GET call
pass
context = {
'tables': Table.objects.all()
}
return render(request, template, context)
推荐阅读
- qliksense - Qlik sense 扩展定义 2 度量
- php - 注意:php wordpress 中数组到字符串的转换
- java - 无法使用 Flink siddhi 库处理 kafka json 消息
- java - Humble Video 拍摄给定时间的快照
- node.js - 无需重新加载窗口即可自动刷新 Firebase 身份验证?
- python - 如何在没有 html/js 的情况下捕获 fastapi websocket 消息?
- javascript - jQuery 不计算表单上的增值税
- html - 样式化基于 Bootstrap 的组件
- node.js - 构建一个restAPI,没有视图。我还应该采用 MVC 作为良好做法吗?
- chisel - 可以像verilog一样雕刻打印时间