13

我有这样的模型:

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' 不存在......

4

2 回答 2

43

.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(), 更 Pythonic)。

你可以走得更远。你的模板中的 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 %}
于 2012-11-19T14:21:11.903 回答
6

我不知道是否有一个漂亮的内置 django 函数可以做到这一点,但你可以从你的文件字段中获取扩展名

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

如果您准备在模板中执行此操作,您可以创建一个自定义标签来包装它

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

于 2012-11-19T13:50:33.203 回答