首页 > 解决方案 > 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)

标签: pythondjango

解决方案


推荐阅读