使用 Django 处理上传的文件

Vin*_*sso 5 python django file-upload

我正在尝试使用 Django 处理上传的 CSV 文件。我如何做这件事的主要逻辑在models.pyviews.py脚本中都有表达。上传文件后,我无法处理任何内容(在我的views.py. 这是两个脚本,但如果我能提供更多信息,我很乐意提供。

在我的models.py文件中,我有两个类,一个用于文档本身,另一个用于文件中的字段。

模型.py:

from django.db import models

import os

class Document(models.Model):
    docfile = models.FileField(upload_to='documents')

class DocumentEntry(models.Model):
    document = models.ForeignKey(Document, on_delete=models.CASCADE)
    field = models.CharField(max_length=250, default="TEST")
Run Code Online (Sandbox Code Playgroud)

接下来,在 my 中,views.py我获取通过 上传的文件request.FILES['docfile']并将其传递给handle_files()函数。但是,当我尝试遍历阅读器时,我无法访问已上传文件中的任何元素。

视图.py:

from django.shortcuts import render
from django.conf import settings
from django.http import HttpResponseRedirect
from django.core.urlresolvers import reverse

import csv

from .models import Document, DocumentEntry
from .forms import UploadFileForm


def process_file(request):
    # Handle file upload
    if request.method == 'POST':
        form = UploadFileForm(request.POST, request.FILES)
        if form.is_valid():

            handle_files(request.FILES['docfile'])

            # Redirect to the document list after POST
            return HttpResponseRedirect(reverse('process_files'))
    else:
        form = UploadFileForm()  # A empty, unbound form

    # Load documents for the list page
    documents = Document.objects.all()

    # Render list page with the documents and the form
    return render(
        request,
        'upload/process_files.html',
        {'documents': documents, 'form': form}
    )


def handle_files(csv_file):

    newdoc = Document(docfile=csv_file)
    newdoc.save()

    reader = csv.DictReader(open(csv_file))
    for row in reader:
        field = row['field']
        entry = DocumentEntry(document=newdoc, field=field)
        entry.save()
Run Code Online (Sandbox Code Playgroud)

Gag*_*yan 4

更新

这是处理函数的完整示例:

def handle_files(csv_file):

   newdoc = Document(docfile=csv_file)
   newdoc.save()

   with open(newdoc.docfile.name) as f:
      reader = csv.DictReader(f)
      for row in reader:
         field = row['field']
         entry = DocumentEntry(document=newdoc, field=field)
         entry.save()
Run Code Online (Sandbox Code Playgroud)