Предполагая, что value
- это имя файла, который вы можете просто сделать
class ImageColumn(tables.Column):
def render(self, value):
return format_html('<a href="/media/{0}" download>{0}</a>', value)
Если это полный путь, который вы можете использовать
class ImageColumn(tables.Column):
def render(self, value):
path = value
name = value.split("/")[-1].split("?")[0]
return format_html('<a href="/media/{}" download>{}</a>', path, name)
split("/")[-1]
даст последняя часть пути (т. е. CFE.jpg)
split("?")[0]
отбросит все параметры запроса, которые могут у вас быть.
Редактировать:
С Вы добавили value
- это ImageFieldFile
, вы можете использовать его name
для разделения.
class ImageColumn(tables.Column):
def render(self, value):
path = value.name
name = path.split("/")[-1].split("?")[0]
return format_html('<a href="/media/{}" download>{}</a>', path, name)
Разделение - это метод для строк. Файл имеет такие атрибуты, как name, url, et c. который можно использовать.
Возможно, вам лучше использовать return format_html('<a href="{}" download>{}</a>', value.url, name)
для URL. Это префикс settings.MEDIA_URL
к имени файла / пути, как вы делаете. Преимущество заключается в том, что вы можете изменить URL-адрес для всех ваших медиафайлов, просто обновив настройки, а не переходя в каждое место и обновляя его.
Редактировать: По запросу я добавляю вывод, который я получил, когда попробовал это
In [5]: type(value)
Out[5]: django.db.models.fields.files.ImageFieldFile
In [6]: value.name
Out[6]: 'private/logos/example_kfBWEZh.jpg'
In [7]: value.name.split("/")[-1]
Out[7]: 'example_kfBWEZh.jpg
Обратите внимание, что value
- это ImageFieldFile
, value.name
- строка, по которой я могу вызвать .split()
.