python - Django:从上传的文件中用models.FileField创建数据可视化
问题描述
在我的项目中,由于models.FileField,我的用户可以上传标准的excel文件。该文件看起来有点像这样:
total partial [...]
user 10 4
other 18 6
有了这些信息,我想使用 Chart.js 创建一些图表和图形,比较用户和其他人的信息,然后在每个上传的文件的 html 页面中将它们显示给我的用户。所以我的计划是使用 openpyxl 读取 excel 文件并创建变量以循环创建图表。这是一个好方法吗?这是我现在的代码,我遇到了这个错误'tuple' object has no attribute 'append'
:
MODELS
class Document(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE)
docfile = models.FileField()
def __str__(self):
return self.docfile
'tuple' object has no attribute 'append'
VIEWS
import from openpyxl import load_workbook
def upload_file(request):
message = 'Upload as many files as you want!'
row = []
if request.method == 'POST':
form = DocumentForm(request.POST, request.FILES)
if form.is_valid():
wb = load_workbook(filename=request.FILES['docfile'].file)
sheet = wb.active
newdoc = Document(docfile=request.FILES['docfile'])
newdoc.save()
for row in sheet.iter_rows(min_row=1, max_col=3, max_row=2, values_only=True):
for cell in row:
row.append(cell)
return redirect('upload_file')
else:
message = 'The form is not valid. Fix the following error:'
else:
form = DocumentForm()
documents = Document.objects.filter(user=request.user.userinformation).all()
context = {
'documents': documents,
'form': form,
'message': message,
'row': row
}
return render(request, 'list.html', context)
HTML
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
</head>
<body>
<!-- List of uploaded documents -->
{% if documents %}
All documents in the database:
<ul>
{% for document in documents %}
<li><a href="{{ document.docfile.url }}">{{ document.docfile.name }} </a></li>
<div class="size">{{document.docfile.size|filesizeformat}}</div>
{% endfor %}
</ul>
{% else %}
<p>No documents.</p>
{% endif %}
<form action="{% url "upload_file" %}" method="post" enctype="multipart/form-data">
{% csrf_token %}
<p><input type="submit" value="Upload"/></p>
</form>
</body>
</html>
{% endblock %}
此外,这些文件只有两行,但大约有 80 列,描述了各种类别(时间、长度、大小......),我想知道在另一个函数中的 excel 文件中工作是否明智(并且可能)。像这样的东西:
def cell_categories(request):
row_time = []
row_size = []
#select the data about the time
for row in sheet.iter_rows(min_row=5, max_col=29, max_row=6, values_only=True):
for cell in row:
row_time.append(cell)
#select the data about the size
for row in sheet.iter_rows(min_row=30, max_col=33, max_row=31, values_only=True):
for cell in row:
row_size.append(cell)
解决方案
推荐阅读
- macos - QT 是否被 macOS Mojave 10.14.6 破坏?
- sqlite - 为什么在`flutter run --release`之后重新创建了数据库?
- php - 测试 http Laravel
- python - 如何解决通过正则表达式获取字符串的“将字符串转换为浮点数时出错”?
- sql - Where...IN 条件中的 SQL 多个 ID 列
- labview - 我需要帮助更改连接到伺服电机的 LabVIEW 读取 VI 的数据采集速率
- list - Flutter 可以创建 AnimationController 列表吗?
- excel - 获取范围内最后一个非空单元格的列号(如果值不唯一)
- javascript - Next.js/React - 如何从 Apollo 客户端 HOC 普遍解析用户语言?
- security - 如何为您不信任的特定 vscode 扩展禁用 Internet 访问