Django FileField: как вернуть только имя файла (в шаблоне) - PullRequest
53 голосов
/ 21 апреля 2010

В моей модели есть поле типа 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

Ответы [ 3 ]

119 голосов
/ 21 апреля 2010

В вашем определении модели:

import os

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

    def filename(self):
        return os.path.basename(self.file.name)
44 голосов
/ 28 октября 2010

Вы можете сделать это, создав фильтр шаблона:

В 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 %}
0 голосов
/ 16 сентября 2016

Вы можете получить доступ к имени файла из объекта поля файла со свойством name.

class CsvJob(Models.model):

    file = models.FileField()

тогда вы можете получить имя файла конкретного объекта, используя.

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