【问题标题】:How to get a name of uploaded file from cleaned_data?如何从cleaned_data 中获取上传文件的名称?
【发布时间】:2017-06-10 16:27:31
【问题描述】:

我有这个文件处理功能:

def handle_uploaded_file(f, person):
    with open(user_directory_path(person, f.name), 'w') as destination:
        for chunk in f.chunks():
            destination.write(chunk)

我在表单保存方法中调用了这个函数:

class CreateMessageForm(forms.Form):
    files = forms.FileField(widget=forms.ClearableFileInput(attrs={'multiple': True}))
    ...
    def save(self):
        ...
        for file in cleaned_data.get('files'):
            handle_uploaded_file(file, self.person)
            message.files.add(file)

但是在发送这个表单后我有一个 AttributeError: 'bytes' object has no attribute 'name'。我不明白出了什么问题。在文档中上传的文件对象有这个属性。

【问题讨论】:

  • 在您的 html 表单中添加 enctype="multipart/form-data"
  • @itzmeontv 已经添加了。对不起,我可能会写一下。

标签: django forms file python-3.x


【解决方案1】:

我建议您在表单中使用FileField

class MyForm(forms.Form):
    file = forms.FileField()

在视图中,执行以下操作:

def upload(request):
   if request.method == 'POST':
       if form.is_valid():
           form = MyForm(request.POST, request.FILES)
           file = form.cleaned_data.get('file')
           ...

【讨论】:

  • 我添加了这个字段的信息。当我在视图中传输这些操作时,我遇到了同样的错误。
  • 您缺少if form.is_valid():,因此cleaned_data 不可用。
【解决方案2】:

会发生以下情况: 当您运行for file in self.cleaned_data["files"]: 时,您期望它遍历一组uploadedFile 对象并将每个对象传递给处理函数。但是cleaned_data['files'] 不是给你的列表,它只是一个上传文件的单个实例。当你迭代一个文件对象时,你实际上是在读取它。所以你最终传递给处理函数的不是文件对象,而是它的内容(作为字节字符串)。在迭代之前重写这部分以检查它是否是一个列表。如果是单个文件,请按原样传递。

【讨论】:

  • 是的,这是真的。谢谢。
【解决方案3】:

在你的 html 表单中试试这个。

<form enctype="multipart/form-data" method="post" action="/foo/">

【讨论】:

    猜你喜欢
    • 2018-04-22
    • 1970-01-01
    • 2015-01-28
    • 1970-01-01
    • 1970-01-01
    • 2023-03-11
    • 1970-01-01
    • 2021-01-10
    • 1970-01-01
    相关资源
    最近更新 更多