Получение расширения файла в шаблоне 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/