【问题标题】:Django FileField: How to return filename only (in template)Django FileField:如何仅返回文件名(在模板中)
【发布时间】:2011-02-10 15:14:35
【问题描述】:

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

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

我想要的是像“.filename”这样的东西,它只会给我文件名而不是路径,比如:

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

这会给出类似myfile.jpg

【问题讨论】:

    标签: django django-templates django-file-upload


    【解决方案1】:

    您也可以在模板中使用“剪切”

    {% for download in downloads %}
      <div class="download">
        <div class="title">{{download.file.filename|cut:'remove/trailing/dirs/'}}</div>
      </div>
    {% endfor %}
    

    【讨论】:

      【解决方案2】:

      您可以使用 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
      【解决方案3】:

      在您的模型定义中:

      import os
      
      class File(models.Model):
          file = models.FileField()
          ...
      
          def filename(self):
              return os.path.basename(self.file.name)
      

      【讨论】:

      • 效果很好,但需要将参数作为 self.file.name 传递给 basename。我认为它需要这个,因为 self.file 是一个文件对象而不是文件的字符串。
      • 添加 @property 装饰器可以避免调用 file.filename() 并且可以简单地使用 file.filename
      • 令人惊讶的是,这个解决方案甚至适用于 S3 存储后端。
      • 它对我有用。您能否提供一些信息来解释它是如何工作的?
      • @user3327344 哪个部分有问题?
      【解决方案4】:

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

      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 %}
      

      【讨论】:

      • 这也是一个不错的方法。也许更便携一点?
      • 你写的过滤器应该是 {{download|filename}}
      • 不要忘记__init__.py 文件,以确保将 templatetags 目录视为 Python 包。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-02-14
      • 2020-08-13
      • 2018-01-10
      • 2014-12-30
      • 2011-02-02
      • 2018-12-14
      • 2013-06-25
      相关资源
      最近更新 更多