在Django模板中获取文件扩展名

时间:2012-11-19 13:42:42

标签: python 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')

我在视图中获取所有File对象,并根据文件类型,我想打印适当的类:

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

当然,'file.get_extension'不存在......

2 个答案:

答案 0 :(得分:23)

你的模特上遗漏了.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().get_extension(),btw更具pythonic。

你可以走得更远。是不是因为/ 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 %}

答案 1 :(得分:2)

我不知道是否有一个漂亮的内置django函数来执行此操作,但您可以从文件字段中获取扩展名

fileName, fileExtension = os.path.splitext(file.name)

如果您已在模板中执行此操作,则可以创建包含此

的自定义标记

https://docs.djangoproject.com/en/dev/howto/custom-template-tags/