手动将文件传递给 Django Form

Manually pass files to Django Form

我有一个表格:

class MessageAttachmentForm(forms.ModelForm):
    class Meta:
        model = MessageAttachment
        fields = ("attachment",)

在我看来,我让它收到了一些名称不正确的文件,所以我尝试创建一个新的 MultiValueDict 并使用正确的名称一个一个地提交文件,如下所示:

if request.FILES:
    files_dict = request.FILES.copy()
    files_dict.clear()

    for file in request.FILES:
        files_dict["attachment"] = request.FILES.get(file)
        attachment_form = MessageAttachmentForm(files_dict)

        if attachment_form.is_valid():
            attachment = attachment_form.save()
            message_object.attachments.add(attachment)

原来,request.FILES returns 这个:

<MultiValueDict: {'attachment0': [<InMemoryUploadedFile: some_image.png (image/png)>], 'attachment1': [<InMemoryUploadedFile: report.pdf (application/pdf)>]}>

并且在 request.FILES 的每次迭代中,当我将文件添加到 files_dict 时,我得到:

<MultiValueDict: {'attachment': [<InMemoryUploadedFile: some_image.png (image/png)>]}>

#And

<MultiValueDict: {'attachment': [<InMemoryUploadedFile: report.pdf (application/pdf)>]}>

看起来不错,但还是不行。我也试过使用普通的字典,但也没用。
attachment_form.errors 表示字段 attachment 是必需的。

感谢您花时间阅读本文,如有任何帮助,我们将不胜感激。

创建表单实例时,您需要先传递 post 数据,然后再传递文件。它们是位置命名参数:

class BaseModelForm(BaseForm):
    def __init__(self, data=None, files=None, auto_id='id_%s', prefix=None,
                 initial=None, error_class=ErrorList, label_suffix=None,
                 empty_permitted=False, instance=None, use_required_attribute=None,
                 renderer=None):
        ...

来源:https://github.com/django/django/blob/master/django/forms/models.py#L280

您需要按如下方式初始化您的 for:

        attachment_form = MessageAttachmentForm(files=files_dict)

或者这样:

        attachment_form = MessageAttachmentForm(None, files_dict)