Получение расширения файла в шаблоне Django
у меня есть модель такой:
class File(models.Model):
name = models.CharField(max_length=45)
description = models.CharField(max_length=100, blank=True)
file = models.FileField(upload_to='files')
я получаю все объекты файла в моем представлении и в соответствии с типом файла, я хотел бы напечатать соответствующий класс:
<a class="pdf">link</a>
или
<a class="word">link</a>
или
<a class="other">link<a/>
в моем шаблоне.
как получить расширение файла в шаблоне Django?
Я хотел бы сделать что-то вроде этого:
{% for file in files %}
{% if file.get_extension == 'pdf' %}
<a class="pdf">link</a>
{% elif file.get_extension = '.doc' %}
<a class="word">link</a>
{% else %}
<a class="other">link<a/>
{% endif %}
{% endfor %}
конечно, 'файл.get_extension ' не существует...
2 ответов
ты пропустил .get_extension
на вашей модели? Это легко, просто добавьте его : -) вы можете иметь все виды методов на модели. Что-то вроде этого:
class File(models.Model):
name = models.CharField(max_length=45)
description = models.CharField(max_length=100, blank=True)
file = models.FileField(upload_to='files')
def extension(self):
name, extension = os.path.splitext(self.file.name)
return extension
(название .extension()
- это более подходящие для Python, чем .get_extension()
, кстати).
вы можете пойти еще дальше. Разве это не структура if / else немного утомительна в вашем шаблоне? Это меньше хлопот в коде Python:
class File(models.Model):
...
def css_class(self):
name, extension = os.path.splitext(self.file.name)
if extension == 'pdf':
return 'pdf'
if extension == 'doc':
return 'word'
return 'other'
шаблон проще таким образом:
{% for file in files %}
<a class="{{ file.css_class }}">link</a>
{% endfor %}
Я не знаю, есть ли отличная встроенная функция django для этого, но вы можете получить расширение из своего filefield
fileName, fileExtension = os.path.splitext(file.name)
Если вы настроены на это в своем шаблоне, вы можете создать пользовательский тег, который обертывает это
https://docs.djangoproject.com/en/dev/howto/custom-template-tags/