django python上传文件有中文名称报错

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了django python上传文件有中文名称报错相关的知识,希望对你有一定的参考价值。

我上传图片,图片名称有中文然后报错了。。该怎么办

参考技术A 1) 看错误堆栈,是不是编码问题
2) 把处理的地方用try except包围起来,尝试转换为可以正常使用的编码方式。

比如gbk和utf-8转换什么的做一下就没问题了。追问

试了,没有用啊

Python Django 模板无法从模型函数中获取名称

【中文标题】Python Django 模板无法从模型函数中获取名称【英文标题】:Python Django Template cannot get name from model function 【发布时间】:2017-02-27 13:31:45 【问题描述】:

虽然我知道我可以从我们的模型中调用函数定义,但我似乎无法提取上传文档的文件名。下面我尝试了以下模板格式,但要么是我想要的输出结果:

.html 版本 1

<form action="." method="GET">
% if documents %
   <ul>
      % for document in documents %
        <li>  document.docfile.filename 
        <input type = "submit" name="load-data" value="Add to Layer"/>
        </li>
      % endfor %
  </ul>

结果:它只显示按钮。

.html 第 2 版

<form action="." method="GET">
% if documents %
   <ul>
      % for document in documents %
        <li>  document.filename 
        <input type = "submit" name="load-data" value="Add to Layer"/>
        </li>
      % endfor %
  </ul>

结果:它只显示按钮。

.html 第 3 版

<form action="." method="GET">
% if documents %
   <ul>
      % for document in documents %
        <li>  document.docfile.name 
        <input type = "submit" name="load-data" value="Add to Layer"/>
        </li>
      % endfor %
  </ul>

结果:与按钮一起打印完整的路径名(例如:/documents/2016/10/08/filename.csv)

这是我的其余代码:

models.py

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

     def filename(self):
        return os.path.basename(self.file.name)

views.py

documents = Document.objects.all()
return render(request, 'gridlock/upload-data.html',
              
               'documents' : documents,
               'form': form
              )

我希望有人能解释为什么我尝试了一切: document.docfile.filename document.file.filenamedocument.filename 对我也不起作用?谢谢!

【问题讨论】:

更好的方法是创建template tag 而不是编辑模型。检查上述答案中的 [SO Post][1]。您将找到有关创建模板标签的答案。 [1]:***.com/questions/2683621/… 【参考方案1】:

我认为您与 document.filename 非常接近,但您的模型需要更改

def filename(self):
    return os.path.basename(self.file.name)

进入

def filename(self):
    # try printing the filename here to see if it works
    print (os.path.basename(self.docfile.name))
    return os.path.basename(self.docfile.name)

在您的模型中,该字段称为 docfile,因此您需要使用 self.docfile 来获取其值。

来源:django filefield return filename only in template

【讨论】:

谢谢!这是正确答案!我会阅读您刚刚链接的参考资料! 哦,我现在明白了。这就是让我在模特下感到困惑的地方!再次感谢!

以上是关于django python上传文件有中文名称报错的主要内容,如果未能解决你的问题,请参考以下文章

CentOS 7下使用Apache2部署Django项目,解决文件名中含有中文报错的问题

Django TemplateDoesNotExist

在 django 中使用相同的输入名称上传多个文件

Python Django 模板无法从模型函数中获取名称

Django保存上传的文件

django上传图片简单验证以及自动修改图片名称