我在这里成功上传了数据库中的文件(工作正常)。这里的问题是文件存储在数据库中,如果万一删除了媒体文件夹,它将引发错误[WinError 2] The system cannot find the file specified: ...
。所以我的问题是如何处理此错误。
如果文件在数据库中,但不在媒体文件夹中,那么我要处理此错误并显示没有错误的模板。我该怎么办?
模板
{% for document in documents %}
<tr>
<td>{{forloop.counter}}</td>
<td>{{document.filename|truncatechars:15}}</td>
<td>{{document.file.size|filesizeformat}}</td>
<td>{{document.category}}</td>
<td>{{document.file.url}}</td>
<tr>
{% endfor %}
模型
class Document(models.Model):
category = models.ForeignKey(DocumentCategory, on_delete=models.CASCADE)
file = models.FileField(upload_to='media/',
validators=[FileExtensionValidator(['pdf', 'xlsx', 'pptx', 'docx','xls']), file_size])
created = models.DateTimeField(auto_now_add=True)
@property
def filename(self):
return os.path.basename(self.file.name)
答案 0 :(得分:1)
您可以使用default_storage.exists(path)来确定。
from django.core.files.storage import default_storage
path = 'path/to/file'
default_storage.exists(path)
但是请注意,您的路径必须在项目文件夹中。
如果文件存在于路径中,则该函数返回True,否则返回False
并且Django FileFeild
中有一个path属性来获取路径。
答案 1 :(得分:0)
Django不应在产品上提供媒体文件,因此与读取常规媒体文件相关的其他代码没有太大意义
self.file.name
包含MEDIA_ROOT的相对路径相对,因此,已实现的方法并不正确
由于您了解os.path
,因此您实际上并不清楚要问什么;有path.exists
方法,更具体的os.path.isfile
异常可以被try-except
块捕获。
try:
# Do something with the file
except IOError:
# Do something in case of error