Django FileField:如何仅返回文件名(在模板中)


74

我的type模型中有一个字段FileField。这给了我一个type的对象File,它具有以下方法:

File.name:文件名,包括来自的相对路径 MEDIA_ROOT

我想要的是类似“ .filename”的东西,它只会给我文件名而不是路径,例如:

{% for download in downloads %}
  <div class="download">
    <div class="title">{{download.file.filename}}</div>
  </div>
{% endfor %}

这会给像 myfile.jpg

Answers:


163

在模型定义中:

import os

class File(models.Model):
    file = models.FileField()
    ...

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

效果很好,但需要将参数作为self.file.name传递给基本名称。我认为它需要此,因为self.file是文件对象,而不是文件的字符串。
约翰,2010年

12
添加@property装饰器可以避免调用file.filename(),而仅可以使用
file.filename

1
令人惊讶的是,该解决方案甚至可以与S3存储后端一起使用。
Stan Redoute

这个对我有用。能否请您提供一些信息以解释其工作原理?
xie186

@ user3327344您遇到什么问题?
路德维克·特拉默

51

您可以通过创建模板过滤器来做到这一点:

myapp/templatetags/filename.py

import os

from django import template


register = template.Library()

@register.filter
def filename(value):
    return os.path.basename(value.file.name)

然后在您的模板中:

{% load filename %}

{# ... #}

{% for download in downloads %}
  <div class="download">
      <div class="title">{{download.file|filename}}</div>
  </div>
{% endfor %}

这也是一个不错的方法。也许更便携一些?
本·基廷

2
当您编写过滤器时,它应该是{{download | filename}}
EmilStenström2014年

4
不要忘记该__init__.py文件,以确保将templatetags目录视为Python包。
shuckc '16

-1

您可以使用name属性从文件字段对象访问文件名。

class CsvJob(Models.model):

    file = models.FileField()

那么您可以使用来获取特定对象的文件名。

obj = CsvJob.objects.get()
obj.file.name property

访问obj.file.name返回媒体目录中的整个路径,例如,它返回tasks/132/foo.jpg而不是foo.jpg
shacker
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.