django filefield仅在模板中返回文件名

Joh*_*ohn 55 django django-templates django-file-upload

我在我的FileField类型的模型中有一个字段.这给了我一个类型为File的对象,它有以下方法:

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

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

就像是:

{% for download in downloads %}
  <div class="download">
    <div class="title">{{download.file.filename}}</div>
  </div>
{% endfor %}
Run Code Online (Sandbox Code Playgroud)

这将给出类似myfile.jpg的东西

谢谢

Lud*_*mer 125

在您的模型定义中:

import os

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

    def filename(self):
        return os.path.basename(self.file.name)
Run Code Online (Sandbox Code Playgroud)

  • 添加@property装饰器可以避免调用file.filename(),只需使用file.filename即可 (8认同)
  • 令人惊讶的是,这个解决方案甚至可以与“S3”存储后端一起使用。 (4认同)

rz.*_*rz. 45

您可以通过创建模板过滤器来完成此操作:

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)
Run Code Online (Sandbox Code Playgroud)

然后在你的模板中:

{% load filename %}

{# ... #}

{% for download in downloads %}
  <div class="download">
      <div class="title">{{download.file|filename}}</div>
  </div>
{% endfor %}
Run Code Online (Sandbox Code Playgroud)

  • 不要忘记`__init __.py`文件,以确保templatetags目录被视为Python包. (4认同)
  • 在您编写过滤器时,它应该是{{download | filename}} (2认同)