使用/ Django 将文件上传到数据库时添加额外的数据字段

Adding additional data fields when uploading file to Database w/ Django

我是新来的,也是 Django 和任何类型的 Web 开发的新手。 现在,我正在做一个允许用户提交学术论文以供其他用户编辑的项目。 我遇到的问题是我想允许用户上传一个文件并使用该文件上传一些关于该文件的数据(元数据?),例如论文的标题(列为 titleField)提示等。 我已经找到了关于如何只上传文件的答案,但没有找到关于如何将数据和文件作为一个整体上传的答案。

如果有人能阐明这一点,那将对我有很大帮助!

这里是 models.py:

from django.db import models

class Document(models.Model):
    docfile = models.FileField(upload_to='documents/%Y/%m/%d')

    titleField = models.CharField(max_length=100, default="")

    dueDateField = models.IntegerField(default=10)

    classNumField = models.IntegerField(default=0)
    promptField = models.CharField(max_length=300, default="") 

下面是上传文件的函数。我了解此部分的工作原理,但它正在从让我感到困惑的表单中上传附加数据:

views.py

def list(request):
    # Handle file upload
    if request.method == 'POST':
        form = DocumentForm(request.POST, request.FILES)
        if form.is_valid():
            newdoc = Document(docfile = request.FILES['docfile'])
            newdoc.save()

            # Redirect to the document list after POST
            return HttpResponseRedirect(reverse('ReadMyPaper.myapp.views.list'))
    else:
        form = DocumentForm() # 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_to_response(
        'myapp/list.html',
        {'documents': documents, 'form': form},
        context_instance=RequestContext(request)
    )

您使用的是 ModelForm 吗?如果没有,那就是如何创建一个:

# forms.py
from django import forms
from .models import Document

class DocumentForm(forms.ModelForm):
    class Meta:
        model = Document

在这两种情况下,如何正确使用它:

# views.py

from .forms import DocumentForm


def document_list(request):
    # Handle file upload
    if request.method == 'POST':
        form = DocumentForm(request.POST, request.FILES)
        if form.is_valid():
            new_doc = form.save()

            # Redirect to the document list after POST
            return HttpResponseRedirect(reverse('ReadMyPaper.myapp.views.list'))
    else:
        form = DocumentForm() # 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_to_response(
        'myapp/list.html',
        {'documents': documents, 'form': form},
        context_instance=RequestContext(request)
    )

第一点:Django 表单(非 ModelForm 表单)做两件事:

  1. 他们显示他们的字段,
  2. 他们清理并验证他们的数据。

因此,当使用 Djago 表单时,您不必直接访问 request.POST(或 request.GET,在极少数情况下您有 GET 表单),只需 form.cleaned_data

第二点:ModelForms也知道

  1. 如何根据关联模型创建自己的字段(但您可以手动限制/覆盖这些字段)和
  2. 根据其(已验证)数据创建或更新模型实例。

因此,当使用 ModelForm 时,您甚至不必在视图中对模型本身执行任何操作(至少对于最常见的用例而言)。