【问题标题】:Adding additional data fields when uploading file to Database w/ Django使用 / Django 将文件上传到数据库时添加其他数据字段
【发布时间】:2015-06-28 01:33:43
【问题描述】:

我是新来的,对 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)
    )

【问题讨论】:

  • 你能把DocumentForm的代码也贴出来吗?

标签: python django upload metadata models


【解决方案1】:

您使用的是 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(或在极少数情况下您拥有 GET 表单的情况下为 request.GET),而只需访问 form.cleaned_data

第二点:ModelForms也知道

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

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

【讨论】:

  • 谢谢你,布鲁诺!这正是我所需要的。现在为了确保我正确理解,它从表单中获取所有数据并作为一个对象上传到数据库中是怎么回事?我可以正确访问此元信息吗?再次感谢。这真的很丰富
猜你喜欢
  • 1970-01-01
  • 2015-03-10
  • 1970-01-01
  • 2015-01-28
  • 2021-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-31
相关资源
最近更新 更多