手动将文件传递给 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)
我有一个表格:
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)